龙格库塔C 语言编程实现

最新一直在学一门很苦逼的课程《数值分析》,哎,高等数学没学好现在后悔了呀,哎回来再恶补,现在说正事。

龙格库塔很牛掰的名字,是两个国外数学家的名字的合并,应该又是两个大牛。

这个方法主要是用来解决微分方程的解,大体思路就是用差分代替微分。细节我就不说了,大家可以去百度,我这里直接给出龙格库塔家族的通式:

这个是龙格库塔家族的通式,如果我们取累加和中的r为4则可以得到如下公式:

这就是四阶龙格库塔方程,据说这里的精度很好,可以精确到小数点后6位。

方程组中的h为差分的步长。

下面给出c语言实现的代码:

#include<stdlib.h>
#include<stdio.h>
/*n表示几等分,n+1表示他输出的个数*/
int RungeKutta(double y0,double a,double b,int n,double *x,double *y,int style,double (*function)(double,double))
{
	double h=(b-a)/n,k1,k2,k3,k4;
	int i;
	x[0]=a;
	y[0]=y0;
	switch(style)
	{
	case 2:
		for(i=0;i<n;i++)
		{
			x[i+1]=x[i]+h;
			k1=function(x[i],y[i]);
			k2=function(x[i]+h/2,y[i]+h*k1/2);
			y[i+1]=y[i]+h*k2;
		}
		break;
	case 3:
		for(i=0;i<n;i++)
		{
			x[i+1]=x[i]+h;
			k1=function(x[i],y[i]);
			k2=function(x[i]+h/2,y[i]+h*k1/2);
			k3=function(x[i]+h,y[i]-h*k1+2*h*k2);
			y[i+1]=y[i]+h*(k1+4*k2+k3)/6;
		}
		break;
	case 4:
		for(i=0;i<n;i++)
		{
			x[i+1]=x[i]+h;
			k1=function(x[i],y[i]);
			k2=function(x[i]+h/2,y[i]+h*k1/2);
			k3=function(x[i]+h/2,y[i]+h*k2/2);
			k4=function(x[i]+h,y[i]+h*k3);
			y[i+1]=y[i]+h*(k1+2*k2+2*k3+k4)/6;
		}
		break;
	default:
		return 0;
	}
	return 1;
}
double function(double x,double y)
{
	return y-2*x/y;
}
//例子求y'=y-2*x/y(0<x<1);y0=1; 

int main()
{
	double x[6],y[6];
	printf("用二阶龙格-库塔方法\n");
	RungeKutta(1,0,1,5,x,y,2,function);
	for(int i=0;i<6;i++)
		printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]);
	printf("用三阶龙格-库塔方法\n");
	RungeKutta(1,0,1,5,x,y,3,function);
	for(i=0;i<6;i++)
		printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]);
	printf("用四阶龙格-库塔方法\n");
	RungeKutta(1,0,1,5,x,y,4,function);
	for(i=0;i<6;i++)
		printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]);
	return 1;
}

结果为:

时间: 2024-08-31 03:39:11

龙格库塔C 语言编程实现的相关文章

图形化编程实现改进的欧拉格式和龙格库塔格式。这里有个C语言的,想改写成C#。

问题描述 图形化编程实现改进的欧拉格式和龙格库塔格式.这里有个C语言的,想改写成C#. 1)改进欧拉法求解常微分方程的初值问题 #include float func(float x,float y) { return(y-x); } float euler(float x0,float xn,float y0,int N) { float x,y,yp,yc,h; int i; x=x0; y=y0; h=(xn-x0)/(float)N; for(i=1;i<=N;i++) { yp=y+h

求助贴:c语言编程问题

问题描述 求助贴:c语言编程问题 解决方案 在你的程序里scanf()函数返回的是一个正整数,无论你输入的是不是-1,他接收的一直是一个参数,所以返回的一直是1.并且还是使用"%lu"来接收参数的,输入-1一定不会退出程序的,输入1.2scanf()只接收到了1,因为1.2不符合输入的规则"%lu",也会返回1.程序不会停下 解决方案二: 疑惑:1.输入0有效,输出真确2.输入-1不退出,-1被强制转换为int类型3.输入1.2输出1个奇数后又printf();然后

c语言-两道C语言编程题:求教各位大神

问题描述 两道C语言编程题:求教各位大神 两元一瓶啤酒,两个啤酒瓶换一瓶啤酒,四个啤酒瓶盖换一瓶啤酒,输入的金额可以买几瓶. 输入一串字符串,写两个函数,第一个函数使输入的字符串全都后移一位,第二个函数将字符串中的字母大写换小写,小写换大写?. 拜托各位了 谢谢~ 解决方案 第一个问题描述不清,不知道是不是可以借啤酒瓶和瓶盖,我的程序按照不可以编写: #include <stdio.h>int foo(int money){ int c = money / 2; int c1 = 0; int

c语言编程报错,简单程序

问题描述 c语言编程报错,简单程序 题目是输出a,b.c中最小数值 自学c语言,求帮忙看看哪里不对呀 #include #include int min(int a,int b,int c ) { int z; if(a<b) z=a; { if(a<c) z=a; else z=c; return (z); } else z=b; { if(b<c) z=b; else z=c; return(z); } } main () { int x,y,m; printf("Inpu

Linux操作系统下C语言编程入门

这里向大家介绍一下在Linux/UNIX 的机器上,进行 C/C++ 编程的一些入门级知识. · 所需具备的背景知识 · 开发所需的基本环境 · 获得帮助的途径 · 通过一个实例了解基本步骤 Prerequisite 先决条件: 在Linux上编写 C 程序,至少要熟悉以下两方面的基础知识: 1. C语言的编程基础,至少要知道一些基本的语法,控制流程等编程常识. 对常用的标准 C 函数库有常识性的了解. 2. 对Linux/UNIX 的操作有常识性的了解,掌握常用的shell 命令,如 ls,

win7下c语言编程软件有哪些

  win7下c语言编程软件有哪些.好多刚开始接触c语言的朋友都想知道用上面软件开发c语言比较好,一般来说微软的东西肯定是最好的,更适合新手学习,等上手了就可以接触别的软件了.这里脚本之家小编就为大家分享一下c语言编程软件有哪些? Microsoft Visual C++ .Microsoft Visual Studio. DEV C++.Code::Blocks.Borland C++.WaTCom C++.Borland C++ Builder.GNU DJGPP C++.Lccwin32

c语言-一个入门级C语言编程问题

问题描述 一个入门级C语言编程问题 已知地球的平均半径为6371.393千米,假设在地球的某一纬度上,有两个处于不同经度的点A.B,用C语言编程求出这两点之间的直线距离.这两点在该纬度剖面上切圆的劣弧长度,以及这两点之间的球面距离.以下是我写的代码.#include ""stdio.h""#include ""math.h"" main(){double xyztsdlRr=6378.137pi=3.1415926;scanf

c语言课程设计-C语言编程 图形图像 仿真

问题描述 C语言编程 图形图像 仿真 即将要进行仿真的课题了.我要做一个模拟仿真的软件.软件有可视化界面,能够根据输入的数据做出曲线图,还能生成一些图像.都点想画图软件那种.我想用C语言开发界面,画图,请问要学那些课程? 解决方案 用C太难,建议你用C#,比VC快的多,而且可以调用C的DLL,如果你想用C写DLL,用C#调用,也相当方便.最重要的是,对于画图这些,界面什么的,用C#绝对是最佳选择. 解决方案二: 用VC吧,可以学学GDI+

《C语言编程魔法书:基于C11标准》—— 导读

前 言 为什么要写这本书 本人在2001年上了大学本科,读计算机科学与技术专业.在第一年的上半学期,对计算机编程还没什么感觉.但是就在考"C语言程序设计"这门专业课的前一个月,感觉这门课学了那么久几乎什么都不会,可把我急坏了.然后就在这短短一个月的时间里又是看书,又是上机实验,终于考了70多分,算是过关了--不过奇怪的是在考试结束后,就发现自己对编程有了感情.到了大二,我们上"数据结构"所使用的教材是基于C++编程语言的,因为之前没学过C++语言,所以只能自学.而在