算法原理
对于常微分方程初值问题
在求解区间[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、改进的欧拉公式是欧拉方法和梯形方法的综合,也是一种显式算法,计算简单,利于编写程序,与欧拉公式相比大大提高了精度。