————方程可以根据需要自定义
欧拉法源代码
#include<stdio.h>
#include<math.h>
//欧拉法解常微分方程组
double F_(double x,double y)//y'表达式,自定义
{
double y_;
y_=y-2*x/y;
return y_;
}
double F(double x)
{
double y;
y=sqrt(2*x+1);//y表达式,精确解,自定义
return y;
}
int main()
{
double h;//步长
double X1;//左区间
double X2;//右区间
double y1;//近似解
double y2;//精确解
double y3;//误差
printf("输入左右区间X1,X2:\n");
scanf("%lf%lf",&X1,&X2);
printf("输入X1点的初值y1:\n");
scanf("%lf",&y1);
double len=X2-X1;//区间长度
printf("输入步长h:\n");
scanf("%lf",&h);
int n;//迭代次数
n=len/h;
int i;
for(i=0;i<n;i++)
{
y1+=h*F_(X1,y1);//欧拉法迭代公式
X1+=h;
y2=F(X1);
if(y2>=y1)
{
y3=y2-y1;
}
else
{
y3=y1-y2;
}
printf("欧拉法迭代%d次的近似解为:%lf精确解为:%lf误差为:%lf\n",i+1,y1,y2,y3);
}
return 0;
}
实验结果
改进欧拉法源代码
#include<stdio.h>
#include<math.h>
//欧拉法解常微分方程组
double F_(double x,double y)//y'表达式,自定义
{
double y_;
y_=y-2*x/y;
return y_;
}
double F(double x)
{
double y;
y=sqrt(2*x+1);//y表达式,精确解,自定义
return y;
}
int main()
{
double h;//步长
double X1;//左区间
double X2;//右区间
double y1;//近似解
double y2;//精确解
double y3;//误差
printf("输入左右区间X1,X2:\n");
scanf("%lf%lf",&X1,&X2);
printf("输入X1点的初值y1:\n");
scanf("%lf",&y1);
double len=X2-X1;//区间长度
printf("输入步长h:\n");
scanf("%lf",&h);
int n;//迭代次数
n=len/h;
int i;
for(i=0;i<n;i++)
{
y1+=(h/2)*(F_(X1,y1)+F_(X1+h,y1+h*F_(X1,y1)));//改进欧拉法迭代公式
X1+=h;
y2=F(X1);
if(y2>=y1)
{
y3=y2-y1;
}
else
{
y3=y1-y2;
}
printf("改进欧拉法迭代%d次的近似解为:%lf精确解为:%lf误差为:%lf\n",i+1,y1,y2,y3);
}
return 0;
}
实验结果
结果分析:欧拉法和改进欧拉法对该常微分方程都可以有一定的精度。
改进欧拉法相较于欧拉法有更好的精度,误差更小。
————如有错误,欢迎指正(#^.^#)