【数值分析】常微分方程数值解:欧拉公式

本科课程参见:《软件学院那些课》

算法原理

对于常微分方程初值问题


在求解区间[a,b]上作等距分割的剖分,步长,记。用数值微商的方法,即用差商近似微商数值求解常微分方程。

用向前差商近似

做出y(x)的在x=x0处的一阶向前差商式:


又,于是得到


而y(x1)的近似值y1可按


求得。类似地,由

以及

得到计算近似值的向前欧拉公式:


由差商(差分)得到的上述方程称为差分方程。

由yn直接算出yn+1值的计算格式称为显式格式,向前欧拉公式是显式格式。


算法流程


算法代码

  //欧拉公式代码
#include
#include
#include
using namespace std;

double f(double x,double y){
	return -50*y;
}

vector Euler(double x0,double y0,double h,int N){
	vector Y(N,0);
	double x=x0;
	Y[0]=y0;
	for(int n=1;n>h>>N;
	    cout<<"请输入要初始函数点(x0,y0):"<>x0>>y0;
	    vector Y=Euler(x0,y0,h,N+1);
	    cout<<"欧拉格式计算结果为:  "<>a;
	}while(a=='y');
		return 0;
}



//改进的欧拉公式
#include
#include
#include
using namespace std;

double f(double x,double y){
	return y-(2*x)/y;
}

vector ImprovedEuler(double x0,double y0,double h,int N){
	vector Y(N,0);
	Y[0]=y0;
	double x=x0;
	double p=0;
	double c=0;
	for(int n=1;n>h>>N;
	    cout<<"请输入要初始函数点(x0,y0):"<>x0>>y0;
	    vector Y=ImprovedEuler(x0,y0,h,N+1);
	    cout<<"欧拉格式计算结果为:  "<>a;
	}while(a=='y');
		return 0;
}

实验过程原始记录

(1)分别取h=0.05,N=10;h=0.025,N=20;h=0.01,N=50,用显式欧拉方法求解微分方程初值 问题:y’=-50y,y(0)=10

h=0.05,N=10


h=0.025,N=20


h=0.01,N=50


(2)用改进的欧拉格式计算下列一阶常微分方程初值问题

其解析解为:


实验结果及分析

1、欧拉公式用以求解常微分方程中的定解问题
2、可以看出,欧拉公式的精度很低,对于不同的步长求得相同点处的值差距可能很大;而且计算中的误差会累计。但显式欧拉公式取向前差商作为平均斜率,计算简单,且利于编写计算机程序,所以对于一些简单函数仍有很大的价值。
3、改进的欧拉公式是欧拉方法和梯形方法的综合,也是一种显式算法,计算简单,利于编写程序,与欧拉公式相比大大提高了精度。

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu未经允许请勿用于商业用途)



你可能感兴趣的:(【数值分析】常微分方程数值解:欧拉公式)