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

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

算法原理

对于常微分方程初值问题


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

用向前差商近似

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


,于是得到


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

 或 

求得。类似地,由

 以及 

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


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

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


算法流程


算法代码

  //欧拉公式代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;

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

vector<double> Euler(double x0,double y0,double h,int N){
	vector<double> Y(N,0);
	double x=x0;
	Y[0]=y0;
	for(int n=1;n<N;n++){
		Y[n] = Y[n-1] + h*f(x,Y[n-1]);
		x += h;
	}
	return Y;
}

int main(){
	char a='n';
	do{
		cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;
	    double h;
	    int N;
	    cin>>h>>N;
	    cout<<"请输入要初始函数点(x0,y0):"<<endl;
	    double x0;
	    double y0;
	    cin>>x0>>y0;
	    vector<double> Y=Euler(x0,y0,h,N+1);
	    cout<<"欧拉格式计算结果为:  "<<endl;
	    for(int i=0;i<N+1;i++){
			cout<<x0+i*h<<"     "<<Y[i]<<endl;
		}
	    cout<<"是否要继续?(y/n)"<<endl;
		cin>>a;
	}while(a=='y');
		return 0;
}



//改进的欧拉公式
#include<iostream>
#include<string>
#include<vector>
using namespace std;

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

vector<double> ImprovedEuler(double x0,double y0,double h,int N){
	vector<double> Y(N,0);
	Y[0]=y0;
	double x=x0;
	double p=0;
	double c=0;
	for(int n=1;n<N;n++){
		p=Y[n-1]+h*f(x,Y[n-1]);
		x +=h;
		c=Y[n-1]+h*f(x,p);
		Y[n]=(p+c)/2;
	}
	return Y;
}

int main(){
	char a='n';
	do{
		cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;
	    double h;
	    int N;
	    cin>>h>>N;
	    cout<<"请输入要初始函数点(x0,y0):"<<endl;
	    double x0;
	    double y0;
	    cin>>x0>>y0;
	    vector<double> Y=ImprovedEuler(x0,y0,h,N+1);
	    cout<<"欧拉格式计算结果为:  "<<endl;
	    for(int i=0;i<N+1;i++){
			cout<<x0+i*h<<"     "<<Y[i]<<endl;
		}
	    cout<<"是否要继续?(y/n)"<<endl;
		cin>>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 未经允许请勿用于商业用途)



没有更多推荐了,返回首页