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時=0、0<バツ<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 、⋯、N−1はグリッド ステップ サイズです。次に、二重分解を実行します: 隣接するノード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 、⋯、N−1.由这些节点构成的剖分为对偶剖分.
(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(あなた私+ 1−2と私は+あなた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(h21−r私は)あなた私+ 1+( −h22−2a ) _あなた私は+(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],あ=
−h22−2a _h21+r2⋯0h21−r1−h22−2a _⋯00h21−r2⋯0⋯⋯⋯⋯00⋯h21+rN − 100⋯−h22−2a _
,
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)T、b=( −う0(h21+r1)、0、0、⋯、0、−うN(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+バツ私は−21−1 ) 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(あなた私+ 1−2と私は+あなた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+( −h2−2α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{行列}\右]、あ=
−h2−2αh _ _h1+私2−2ある⋯0h1−私1+2ある−h2−2αh _ _⋯00h1−私2+2ある⋯0⋯⋯⋯⋯00⋯h1+私N − 1−2ある00⋯−h2−2α時間_
、
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)T、F=( −う0(h1+私1−2ある)、0、0、⋯、0、−うN(h1−私N − 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つの手法の数値解と解析解のイメージを描きました)