2階常微分方程式の数値解法(中心差分法、有限体積法)

2階常微分方程式の数値解法(中心差分法、有限体積法)

ここでは方程式を解くための中心差分法と有限体積法を紹介します。
問題:
差分法の中心差分形式と有限体積法の 2 点境界値問題
u ' ' − α ( 2 x − 1 ) u ' − 2 α u = 0 , 0 < x < 1 を解きます。 u ( 0 ) = u ( 1 ) = 1 、 u^{\prime\prime}-\alpha\left(2x-1\right)u^\prime-2\alpha u=0,0<x<1 u \left(0\right )=u\left(1\right)=1、あなた「」ある( 2 ×1 )あなた2=00<バツ<1u _( 0 )=あなた( 1 )=1
パラメータα = 10 \alpha=10ある=図10に示すように、異なるグリッドの最大誤差と収束次数が得られる。

問題分析

ステップ 1: メッシュ生成: まず、N + 1 個のノードを次のように取得します: a = x 0 < x 1 < x 2 < ⋯ < x N = ba=x_0<x_1<x_2<\cdots<x_N=bある=バツ0<バツ1<バツ2<<バツN=b
区間 [a, b] を等間隔に分割し、それを N 個の小さな区間に分割します。h = xi + 1 − xi 、 i = 1 , 2 , ⋯ , N − 1 h=x_{i+1} - にx_i,i=1,2,\cdots,N-1h=バツ+ 1バツ私は=1 2 N1はグリッド ステップ サイズです。次に、二重分解を実行します: 隣接するノードxi + 1、xi x_{i+1}、x_i をバツ+ 1バツ私は的中点xi + 1 2 = 1 2 ( xi + 1 − xi ) 、 i = 1 、 2 、 ⋯ 、 N − 1. x_{i+\frac{1}{2}}=\frac{1}{2 }\left(x_{i+1}-x_i\right),i=1,2,\cdots,N-1。バツ+21=21( ×+ 1バツ私は)=1 2 N1.由这些节点构成的剖分为对偶剖分.
(i)中心差分法:
1 h 2 ( u i + 1 − 2 u i + u i − 1 ) − α ( 2 x i − 1 ) 2 h ( u i + 1 − u i − 1 ) − 2 α u i = 0 \frac{1}{h^2}\left(u_{i+1}-2u_i+u_{i-1}\right)-\frac{\alpha\left(2x_i-1\right)}{2h}\left(u_{i+1}-u_{i-1}\right)-2\alpha u_i=0 h21(あなた+ 12私は+あなたi 1)2時間α 2 ×私は1 )(あなた+ 1あなたi 1)2αu _ _私は=0
⇒ \Rightarrow
( 1 h 2 − ri ) ui + 1 + ( − 2 h 2 − 2 α ) ui + ( 1 h 2 + ri ) ui − 1 = 0 \left(\frac{1}{h^2}-r_i \right)u_{i+1}+\left(-\frac{2}{h^2}-2\alpha\right)u_i+\left(\frac{1}{h^2}+r_i\right) u_{i-1}=0(h21r私は)あなた+ 1+(h222a ) _あなた私は+(h21+r私は)あなたi 1=0

ここで、ri = α ( 2 xi − 1 ) 2 h です。r_i=\frac{\alpha\left(2x_i-1\right)}{2h}。r私は=2時間α 2 ×私は1 )
A= [ − 2 h 2 − 2 α 1 h 2 − r 1 0 ⋯ 0 0 1 h 2 + r 2 − 2 h 2 − 2 α 1 h 2 − r 2 ⋯ 0 0 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 0 0 0 ⋯ 1 h 2 + r N − 1 − 2 h 2 − 2 α ] , A=\left[\begin{matrix}-\frac{2}{h^2}-2\alpha&\frac{1} {h^2}-r_1&0&\cdots&0&0\\\frac{1}{h^2}+r_2&-\frac{2}{h^2}-2\alpha&\frac{1}{h^2}-r_2& \cdots&0&0\\\cdots&\cdots&\cdots&\cdots&\cdots&\cdots\\0&0&0&\cdots&\frac{1}{h^2}+r_{N-1}&-\frac{2}{h^2} -2\alpha\\\end{行列}\right],= h222a _h21+r20h21r1h222a _00h21r2000h21+rN 100h222a _ ,
U = ( u 1 , u 2 , ⋯ , u N − 1 ) T , b = ( − u 0 ( 1 h 2 + r 1 ) , 0 , 0 , ⋯ , 0 , − u N ( 1 h 2 + r N − 1 ) ) TU=\left(u_1,u_2,\cdots,u_{N-1}\right)^T,\\ b=\left(-u_0\left(\frac{1}{h^) 2}+r_1\right),0,0,\cdots,0,-u_N\left(\frac{1}{h^2}+r_{N-1}\right)\right)^TU=(あなた1あなた2あなたN 1)Tb=(0(h21+r1)000N(h21+rN 1) )T .
次に AU=b.
次に U を解きます。

(ii) 有限体積法: W ( x ) = dudx W\left(x\right)=\frac{du}{dx}
とします。W( × )=dx _あなた、次にd W dx − α ( 2 x − 1 ) W ( x ) − 2 α u = 0 となります。 \frac{dW}{dx}-\alpha\left(2x-1\right)W\left(x\右)-2\alpha u=0。dx _dW _ある( 2 ×1 )W( × )2=0.
两边同時解分得:
W ( xi + 1 2 ) − W ( xi − 1 2 ) − ∫ xi − 1 2 xi + 1 2 α ( 2 x − 1 ) W ( x ) dx − ∫ xi − 1 2 xi + 1 2 2 α udx = 0. W(x_{i+\frac{1}{2}})-W(x_{i-\frac{1}{2}})-\int_{x_{i- \frac{1}{2}}}^{x_{i+\frac{1}{2}}}α(2x-1)W(x)dx-\int_{x_{i-\frac{1}{ 2}}}^{x_{i+\frac{1}{2}}}2αudx=0。W ( ×+21)W ( ×私は21)バツ私は21バツ+21α 2 ×1 ) W ( x ) d xバツ私は21バツ+212αudx _ _ _=0.
分中定理により得られる値:
W ( xi + 1 2 ) − W ( xi − 1 2 ) − W ( xi ) ∫ xi − 1 2 xi + 1 2 α ( 2 x − 1 ) dx − ui ∫ xi − 1 2 xi + 1 2 2 α dx = 0. W(x_{i+\frac{1}{2}})-W(x_{i-\frac{1}{2}})-W(x_i )\int_{x_{i-\frac{1}{2}}}^{x_{i+\frac{1}{2}}}α(2x-1)dx-u_i\int_{x_{i-\ frac{1}{2}}}^{x_{i+\frac{1}{2}}}2αdx=0。W ( ×+21)W ( ×私は21)W ( ×私は)バツ私は21バツ+21α 2 ×1 ) dx _あなた私はバツ私は21バツ+212αdx _ _ _=0.
⇒ \Rightarrow
W ( xi + 1 2 ) − W ( xi − 1 2 ) − W ( xi ) ( xi + 1 2 + xi − 1 2 − 1 ) h α − 2 α uih = 0 W(x_{i+\frac{ 1}{2}})-W(x_{i-\frac{1}{2}})-W(x_i)(x_{i+\frac{1}{2}}+x_{i-\frac{ 1}{2}}-1)hα-2α u_ih=0W ( ×+21)W ( ×私は21)W ( ×私は) ( ×+21+バツ私は211 ) h α2αu _ _私はh=0
⇒ \Rightarrow
1 h ( ui + 1 − 2 ui + ui − 1 ) − α 4 (xi + 1 + 2 xi + xi − 1 ) (ui + 1 − ui − 1 ) + α 2 ( ui + 1 − ui − 1 ) − 2 α uih = 0 \frac{1}{h}\left(u_{i+1}-2u_i+u_{i-1}\right)-\frac{\alpha}{4}\left(x_ {i+1}+2x_i+x_{i-1}\right)\left(u_{i+1}-u_{i-1}\right)+\frac{\alpha}{2}\left(u_ {i+1}-u_{i-1}\right)-{2\alpha\ u}_ih=0h1(あなた+ 12私は+あなたi 1)4ある( ×+ 1+2倍_私は+バツi 1)(あなた+ 1あなたi 1)+2ある(あなた+ 1あなたi 1)2αu _ _ 私はh=0
⇒ \Rightarrow
( 1 h − li + α 2 ) ui + 1 + ( − 2 h − 2 α h ) ui + ( 1 h + li − α 2 ) ui − 1 = 0 , \left(\frac{1}{h }-l_i+\frac{\alpha}{2}\right)u_{i+1}+\left(-\frac{2}{h}-2\alpha h\right)u_i+\left(\frac{1 }{h}+l_i-\frac{\alpha}{2}\right)u_{i-1}=0、(h1私は+2ある)あなた+ 1+(h22αh _ _あなた私は+(h1+私は2ある)あなたi 1=0
ここで   li = α 4 ( xi + 1 + 2 xi + xi − 1 ) {\ l}_i=\frac{\alpha}{4}\left(x_{i+1}+2x_i+x_{i- 1}\右) 私は=4ある( ×+ 1+2倍_私は+バツi 1) _ A = [ − 2 h − 2 α h 1 h − l 1 + α 2 0 ⋯ 0 0 1 h + l 2 − α 2 − 2 h − 2 α h 1 h − l 2 + α 2 ⋯ 0 0 ⋯ とします
⋯ ⋯ ⋯ ⋯ ⋯ 0 0 0 ⋯ 1 h + l N − 1 − α 2 − 2 h − 2 α h ] , A=\left[\begin{matrix}-\frac{2}{h}-2\ alpha h&\frac{1}{h}-l_1+\frac{\alpha}{2}&0&\cdots&0&0\\\frac{1}{h}+l_2-\frac{\alpha}{2}&-\frac {2}{h}-2\alpha h&\frac{1}{h}-l_2+\frac{\alpha}{2}&\cdots&0&0\\\cdots&\cdots&\cdots&\cdots&\cdots&\cdots\\0&0&0& \cdots&\frac{1}{h}+l_{N-1}-\frac{\alpha}{2}&-\frac{2}{h}-2\alpha h\\\end{行列}\右]、= h22αh _ _h1+22ある0h11+2あるh22αh _ _00h12+2ある000h1+N 12ある00h2時間_

U = ( u 1 , u 1 , ⋯ , u N − 1 ) T , F = ( − u 0 ( 1 h + l 1 − α 2 ) , 0 , 0 , ⋯ , 0 , − u N ( 1 h − l N − 1 + α 2 ) ) TU=\left(u_1,u_1,\cdots,u_{N-1}\right)^T,F=\left(-u_0\left(\frac{1}{h) }+l_1-\frac{\alpha}{2}\right),0,0,\cdots,0,-u_N\left(\frac{1}{h}-l_{N-1}+\frac{ \alpha}{2}\right)\right)^TU=(あなた1あなた1あなたN 1)TF=(0(h1+12ある)000N(h1N 1+2ある) )T
次に AU=F となり、
U を求めます。

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

function E=Centered(h)%中心差分法
u0=1;
uN=1;
N=1/h;
x=zeros(1,N+1);
for i=1:(N)
    x(i+1)=x(i)+h;
end
R=zeros(1,N+1);
for i=1:(N+1)
    R(i)=10*(2*x(i)-1)/(2*h);
end
A=zeros(N-1,N-1);
A(1,1)=-2/(h*h)-20;
A(1,2)=1/(h*h)-R(2);
A(N-1,N-1)=-2/(h*h)-20;
A(N-1,N-2)=1/(h*h)+R(N)
for i=2:(N-2)
        A(i,i)=-2/(h*h)-20;
        A(i,i+1)=1/(h*h)-R(i+1);
        A(i,i-1)=1/(h*h)+R(i+1);
end
b=zeros(1,N-1);
b(1)=-u0*(1/(h*h)+R(2));
b(N-1)=-uN*(1/(h*h)-R(N));
y=A\b';
Y=zeros(N+1,1);
Y(1,1)=1;
Y(N+1,1)=1;
for i=2:N
    Y(i,1)=y(i-1,1);
end
plot(x,Y ,'r*-');
hold on;
exa = dsolve('D2u = 10*(2*x-1)*Du+20*u', 'u(0)=1','u(1)=1', 'x');       %求出解析解
ezplot(exa, [0,1]);       %画出解析解的图像
legend('中心差分法数值解','解析解' );
u=zeros(1,N+1);
exa=inline(exa);
for i=1:(N+1)
    u(i)=feval(exa,x(i));
    e(i)=abs(u(i)-Y(i));
end
E=max(e);

function E=V(h)%有限体积法
u0=1;
uN=1;
N=1/h;
x=zeros(1,N+1);
for i=1:(N)
    x(i+1)=x(i)+h;
end
R=zeros(1,N+1);
for i=2:N
    R(i)=2.5*(x(i+1)+2*x(i)+x(i-1));
end
A=zeros(N-1,N-1);
A(1,1)=-2/h-20*h;
A(1,2)=1/h+5-R(2);
A(N-1,N-1)=-2/h-20*h;
A(N-1,N-2)=1/h-5+R(N);
for i=2:(N-2)
        A(i,i)=-2/h-20*h;
        A(i,i+1)=1/h+5-R(i+1);
        A(i,i-1)=1/h-5+R(i+1);
end
b=zeros(1,N-1);
b(1)=-u0*(1/h-5+R(2));
b(N-1)=-uN*(1/h+5-R(N));
y=A^(-1)*b';
Y=zeros(N+1,1);
Y(1,1)=1;
Y(N+1,1)=1;
for i=2:N
    Y(i,1)=y(i-1,1);
end
plot(x,Y ,'r*-');
hold on;
exa = dsolve('D2u = 10*(2*x-1)*Du+20*u', 'u(0)=1','u(1)=1', 'x');       %求出解析解
ezplot(exa, [0,1]);       %画出解析解的图像
legend('有限体积法数值解','解析解' );
u=zeros(1,N+1);
exa=inline(exa);
for i=1:(N+1)
    u(i)=feval(exa,x(i));
    e(i)=abs(u(i)-Y(i));
end
E=max(e);
%调试
clear all;clc;close  all;
h=[0.1,0.2,0.01,0.02,0.05];
for i=1:5
    E(i)=V(h(i));
    F(i)=Centered(h(i));
end

質問結果

ここに画像の説明を挿入します

中心差分法と有限体積法の最大誤差の差は小さく、次数が同じであることが分かりましたので、中心差分法と有限体積法の収束次数は同じであると考えることができます。中心差分法の収束も同様で、次数が 2 次であるため、有限体積法の収束次数も 2 次であることがわかります。

(h=0.1を例として、2つの手法の数値解と解析解のイメージを描きました)
ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

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