求簡單的常微分方程
阿新 • • 發佈:2018-06-13
不錯 http www execution 相關 continue 特殊 常微分方程 。。
求常微分方程的原理(懶得重新打一遍。。於是把我知乎上的一個相關回答搬過來):
這裏介紹一種方法,叫歐拉法,比如,形如:
$$ \left\{ \begin{gathered} \quad \frac{dy}{dx}=f(x,y) \\ y(x_0)=y_0 \end{gathered} \right. $$
的一階微分方程(註:用數值方法求解時,默認有解且唯一)。
通過初始條件: $$ y(x_0)=y_0 $$
可以計算出: $$ y‘(x_0)=f(x_0,y_0) $$
假設 充分小,則近似的有:
$$ \frac{y(x_1)-y(x_0)}{h} \approx y‘(x_0)=f(x_0,y_0) \quad $$
記 $$ y_i=y(x_i) \quad i=0,1,...,n $$
取 $$ y_1=y_0+hf(x_0,y_0) $$
同樣的方法,計算出
$$ y_2=y_1+hf(x_1,y_1) $$
於是得到遞推公式:
$$ y_{i+1}=y_i+hf(x_i,y_i) ,h為步長 $$
參考:常微分方程組的數值算法解法 P1~2
例題:求一階微分方程:
$$ \left\{ \begin{gathered} \frac{dy}{dx}=y \\ y(0)=1 \end{gathered} \right. \\ 步長h=0.01,x=0.10時的值 $$
下面是代碼實現:
#include<bits/stdc++.h> int main() { // 歐拉法:yi+1 = yi + h * f(x,y) // double h = 0.001, x = 0.10, y = 1.00; for(double i = 0.00; i <= x; i += h) y += h*y; printf("%.4f\n", y); return 0; }
Output:
1.1157 Process returned 0 (0x0) execution time : 0.420 s Press any key to continue.
精確結果:
e^0.1 1.1051709180756
當h=0.001時:
1.1051 Process returned 0 (0x0) execution time : 0.401 s Press any key to continue.
看起來還是不錯的,但精度還是不夠,一些特殊方程,或許需要更高的精度,則會導致計算效率非常差。。。
使用龍格-庫塔法提高精度:
ps:明天再填。。。
求簡單的常微分方程