生活随笔
收集整理的這篇文章主要介紹了
常微分方程数值解:欧拉公式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法原理
對于常微分方程初值問題
在求解區間[a,b]上作等距分割的剖分,步長,記。用數值微商的方法,即用差商近似微商數值求解常微分方程。
用向前差商近似
做出y(x)的在x=x0處的一階向前差商式:?
又,于是得到
而y(x1)的近似值y1可按
?或?
求得。類似地,由
?以及?
得到計算近似值的向前歐拉公式:
由差商(差分)得到的上述方程稱為差分方程。
由yn直接算出yn+1值的計算格式稱為顯式格式,向前歐拉公式是顯式格式。
算法流程
算法代碼
[cpp]?view plaincopy
?? #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?未經允許請勿用于商業用途)
總結
以上是生活随笔為你收集整理的常微分方程数值解:欧拉公式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。