取h=0.1时用Euler法,改进Euler法,Rung-Kutta方法求其数值解并与精确解进行比较。
输入:求解区间,初值,数值解个数
输出:数值解
代码
#include<stdio.h>
#include<math.h>
#define f(y,x) (y-((2*x)/y))
#define F(y,x) (y-(2*x/y))
#define ff(y,x) (y-(2*x/y))
#define y(x) (sqrt(1+2*x))
int main()
{
int i,n=10;
double h,a,b,y0,y1,y2,y3,x,k1,k2,n1,n2,n3,n4;
printf("左区间:");scanf("%lf",&a);
printf("右区间:");scanf("%lf",&b);
printf("初值:") ;scanf("%lf",&y0);
printf("数值个数:");scanf("%d",&n);
y1=y2=y3=y0;
x=a;
h=(b-a)/n;
printf("x\t\ty(4阶龙格)\ty(改进)\t\ty(欧拉)\t\ty(精确)\n");
printf("%lf\t%lf\t%lf\t%lf\t%lf\n",x,y3,y2,y1,y(x));
for(i=1;i<=n;i++)
{
n1=h*ff(y3,x);
n2=h*ff((y3+n1/2),(x+h/2));
n3=h*ff((y3+n2/2),(x+h/2));
n4=h*ff((y3+n3),(x+h));
y3=y3+(n1+2*n2+2*n3+n4)/6; //4阶龙格
k1=h*F(y2,x);
k2=h*F((y2+k1),(x+h));
y2=y2+(k1+k2)/2; //改进欧拉和二阶龙格
y1=y1+h*f(y1,x); //欧拉
x=x+h;
printf("%lf\t%lf\t%lf\t%lf\t%lf\n",x,y3,y2,y1,y(x));
}
return 0;
}
欧拉、改进欧拉、四阶龙格-库塔是比较简单的,只要理解其中的公式那就很好办啦