1次常微分方程式の数値解法(2次の陽的、陰的なアダムスの公式およびミルン法)

一次常微分方程式の数値解法

ここでは、方程式を解くための 2 次の陽的および陰的なアダムスの公式とミルン法を紹介します。
質問: 初期値問題
u ′ = u − t 2 , 0 ≤ t ≤ 1 , u ( 0 ) = 0 u^\prime=ut^2,\ \ \ 0\le t\le1 ,u\left( 0 \右)=0あなた=あなたt2   0t1 あなた( 0 )=0

二次の陽的、陰的なアダムスの公式とミルン法を使用して数値解を求め、τ = 0.2 をとり、厳密解とオイラーと比較してみてください。

2 次の明示的なアダムスの公式は次のとおりです。

un + 1 = un + τ 2 ( 3 f ( tn , un ) − f ( tn − 1 , un − 1 ) ) u_{n+1}=u_n+\frac{\tau}{2}\left(3f\ left(t_n,u_n\right)-f\left(t_{n-1},u_{n-1}\right)\right)あなたn + 1=あなた+2t( 3f _( tあなた)f( tn 1あなたn 1) )

2 次の暗黙的なアダムスの公式は次のとおりです。

un + 1 = un + τ 2 ( f ( tn + 1 , un + 1 ) + f ( tn , un ) ) u_{n+1}=u_n+\frac{\tau}{2}\left(f\left (t_{n+1},u_{n+1}\right)+f\left(t_n,u_n\right)\right)あなたn + 1=あなた+2t( f( tn + 1あなたn + 1)+f( tあなた) )

ミルン法の公式は次のとおりです。

un + 2 = un + τ 3 ( f ( tn + 2 , un + 2 ) + 4 f ( tn + 1 , un + 1 ) + f ( tn , un ) ) u_{n+2}=u_n+\frac{ \tau}{3}\left(f\left(t_{n+2},u_{n+2}\right)+4f\left(t_{n+1},u_{n+1}\right) +f\左(t_n,u_n\右)\右)あなたn + 2=あなた+3t( f( tn + 2あなたn + 2)+4f_ _( tn + 1あなたn + 1)+f( tあなた) )

すべてのコードは次のとおりです

clear all;clc;close  all;
fun= inline('u-t^2','t','u');
a = 0; b =1;
u0 = 0;
h = 0.2;
M =floor(b-a)/h ; 
S=Milne(fun, a, b, u0, h);%or Adamsout(fun, t0, tn, u0, h) or Adamsin(fun, t0, tn, u0, h)
plot(S(:,1),S(:,2) ,'r*-');    hold on;
exa = dsolve('Du = u-t^2', 'u(0) = 0', 't');       %求出解析解
ezplot(exa, [0,1,-1,0.05]);       %画出解析解的图像
legend('数值解','解析解' );

function S = Adamsout(fun, t0, tn, u0, h)%二阶显式的Adams 公式
%fun:微分方程的右表达式
%t0, tn为区间
%u0 为初值
M =floor(tn-t0)/h ;      %离散点的个数M+1
T =zeros(1, M+1); U =zeros(1, M+1);         %行向量
T(1) = t0;
T(2)=t0+h;
U(1) = u0;
K =  feval(fun, T(1) ,U(1));
U(2)=u0+h*K;
for i = 2:M
    K0 =  feval(fun, T(i-1) ,U(i-1));
    K1 =  feval(fun, T(i) ,U(i));
    U(i+1) = U(i) +h/2*(3*K1-K0);
    T(i+1) = T(i) +h;
end
S = [T' U'];

function S = Adamsin(fun, t0, tn, u0, h)% 二阶隐式 Adams 法
%fun:微分方程的右表达式
%t0, tn为区间
%u0 为初值
M =floor(tn-t0)/h ;      %离散点的个数M+1
T =zeros(1, M+1); U =zeros(1, M+1);         %行向量
T(1) = t0;
U(1) = u0;
for i = 1:M
    K1 =  feval(fun, T(i) ,U(i));
    K2 =  feval(fun, T(i)+h ,U(i)+ h*K1);
    U(i+1) = U(i) +h/2 *(K1 + K2);
    T(i+1) = T(i) +h;
end
S = [T' U'];
function S = Milne(fun, t0, tn, u0, h)%Milne 方法
%fun:微分方程的右表达式
%t0, tn为区间
%u0 为初值
M =floor(tn-t0)/h ;      %离散点的个数M+1
T =zeros(1, M+1); U =zeros(1, M+1);         %行向量
T(1) = t0;
T(2) = t0+h;
K=Rungekutta(fun,t0,tn,u0,h);
U=(K(:,2))';
for i = 3:(M+1)
    K1 =  feval(fun, T(i-1) ,U(i-1));
    K2=  feval(fun, T(i-2) ,U(i-2)); 
    K3 =  feval(fun, T(i-1)+h ,U(i));
    U(i) = U(i-2) +h/3 *(K2 + 4*K1+K3);
    T(i) = T(i-1) +h;
end
S = [T' U'];

質問結果

(1) 二次陽的アダムズ数値解と解析解画像:
ここに画像の説明を挿入します

(2) 二次陰的アダムス数値解と解析解イメージ
ここに画像の説明を挿入します
(3) ミルン法の数値解と解析解イメージ

ここに画像の説明を挿入します
最大誤差の比較:
ここに画像の説明を挿入します

要約する

要約: 画像解析から、2 次陰的アダムス法とミルン法は、2 次陽的アダムス法よりも適合度が高いことが明確にわかります。アダムス法とミルン法のどちらがより正確であるかということで、両者の誤差の絶対値を比較してみましたが、この表からミルン法の精度が最も高いことがわかります。

おすすめ

転載: blog.csdn.net/Sophiayinqianbao/article/details/128405641