日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時間:2025/3/21 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常微分方程数值解:欧拉公式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

算法原理

對于常微分方程初值問題


在求解區(qū)間[a,b]上作等距分割的剖分,步長,記。用數(shù)值微商的方法,即用差商近似微商數(shù)值求解常微分方程。

用向前差商近似

做出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和要計算的函數(shù)值的個數(shù)N:?"<<endl;??
  • ????????double?h;??
  • ????????int?N;??
  • ????????cin>>h>>N;??
  • ????????cout<<"請輸入要初始函數(shù)點(x0,y0):"<<endl;??
  • ????????double?x0;??
  • ????????double?y0;??
  • ????????cin>>x0>>y0;??
  • ????????vector<double>?Y=Euler(x0,y0,h,N+1);??
  • ????????cout<<"歐拉格式計算結(jié)果為:??"<<endl;??
  • ????????for(int?i=0;i<N+1;i++){??
  • ????????????cout<<x0+i*h<<"?????"<<Y[i]<<endl;??
  • ????????}??
  • ????????cout<<"是否要繼續(xù)?(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和要計算的函數(shù)值的個數(shù)N:?"<<endl;??
  • ????????double?h;??
  • ????????int?N;??
  • ????????cin>>h>>N;??
  • ????????cout<<"請輸入要初始函數(shù)點(x0,y0):"<<endl;??
  • ????????double?x0;??
  • ????????double?y0;??
  • ????????cin>>x0>>y0;??
  • ????????vector<double>?Y=ImprovedEuler(x0,y0,h,N+1);??
  • ????????cout<<"歐拉格式計算結(jié)果為:??"<<endl;??
  • ????????for(int?i=0;i<N+1;i++){??
  • ????????????cout<<x0+i*h<<"?????"<<Y[i]<<endl;??
  • ????????}??
  • ????????cout<<"是否要繼續(xù)?(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)用改進的歐拉格式計算下列一階常微分方程初值問題

    其解析解為:?


    實驗結(jié)果及分析

    1、歐拉公式用以求解常微分方程中的定解問題
    2、可以看出,歐拉公式的精度很低,對于不同的步長求得相同點處的值差距可能很大;而且計算中的誤差會累計。但顯式歐拉公式取向前差商作為平均斜率,計算簡單,且利于編寫計算機程序,所以對于一些簡單函數(shù)仍有很大的價值。
    3、改進的歐拉公式是歐拉方法和梯形方法的綜合,也是一種顯式算法,計算簡單,利于編寫程序,與歐拉公式相比大大提高了精度。

    (轉(zhuǎn)載請注明作者和出處:http://blog.csdn.net/xiaowei_cqu?未經(jīng)允許請勿用于商業(yè)用途)

    總結(jié)

    以上是生活随笔為你收集整理的常微分方程数值解:欧拉公式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。