一次常微分方程式の数値解法
ここでは、方程式を解くための 2 次の陽的および陰的なアダムスの公式とミルン法を紹介します。
質問: 初期値問題
u ′ = u − t 2 , 0 ≤ t ≤ 1 , u ( 0 ) = 0 u^\prime=ut^2,\ \ \ 0\le t\le1 ,u\left( 0 \右)=0あなた』=あなた−t2、 0≤t≤1 、あなた( 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 次陽的アダムス法よりも適合度が高いことが明確にわかります。アダムス法とミルン法のどちらがより正確であるかということで、両者の誤差の絶対値を比較してみましたが、この表からミルン法の精度が最も高いことがわかります。