] 0,1 [の熱方程式の周期境界条件


13

私たちは一次元でスムーズな初期条件と熱方程式を考えてみましょう:

∂tu=∂xxu
開区間で]0,1[、と私たちは有限差分を数値的にそれを解決したいと仮定しましょう。

問題を適切に解決するには、x=0およびで境界条件を付与する必要があることを知っていx=1ます。ディリクレまたはノイマンがうまく機能することを知っています。

最初のケースでN内点xk=kN+1のためにk=1,⋯,N、その後、私はN未知数を:uk=u(xk)のためのk=1,⋯,N、のでu境界で規定されています。

2番目のケースでは、N+2未知数実際にありu0,⋯,uN+1、境界でラプラシアンを離散化するために(同種の)ノイマンBCを使用する方法を知っています。x−1およびxN+2および等式:

u1−u−12h=0=uN+2−uN2h

私の質問は、定期的なBCについてです。私は1つの方程式を使用することができると感じている、すなわち が、おそらく2、そして私が使用する ∂ Xのu (0 )= ∂ X Uを(1 )

u(0)=u(1)
∂xu(0)=∂xu(1)

しかし、私にはわかりません。どれだけの未知数を持っているべきか、私にもわかりません。それは、?N+1


ディリクレまたはノイマンの境界条件はありますか?ゴーストセルの数は、ノイマン境界条件の近似の次数に依存します。
— -ilciavo

@ilciavo、質問は周期的な境界条件についてです。
— ビル・バルト

回答:


8

これを行う最良の方法は、(あなたが言ったように)周期境界条件の定義を使用し、という事実を使用して最初から方程式を正しく設定することです。実際、さらに強力なのは、周期的な境界条件がx = 0をx = 1で識別することです。このため、ソリューションドメインにはこれらのポイントのうち1つのみを含める必要があります。周期的な境界条件を使用する場合、境界がないため、オープン間隔は意味がありません。あなたは(0)=あなたは(1)バツ=0バツ=1

この事実は、x = 0と同じであるため、点を置かないことを意味します。離散N + 1つの点、あなたはその後、事実を使用することを定義することにより、左側のポイントのx 0 IS X Nとの右のポイントxをNであるX 0を。バツ=1バツ=0N+1バツ0 バツNバツN バツ0

周期的グリッドの概略図

PDEは、空間でdiscとして離散化できます。

∂∂t[バツ0バツ1⋮バツN]=1△バツ2[バツN−2バツ0+バツ1バツ0−2バツ1+バツ2⋮バツN−1−2バツN+バツ0]

これは、行列形式で書くことができる ここで、 A=[ - 2 1 0 ⋯ 0 1 1 - 2 1 0 ⋯ 0

∂∂tバツ→=1△バツ2Aバツ→
A=[−210⋯011−210⋯0⋱⋱⋱⋱⋱⋱0⋯01−2110⋯01−2]。

もちろん、このマトリックスを実際に作成または保存する必要はありません。必要に応じて最初と最後のポイントを特別に処理するように注意しながら、有限差分をその場で計算する必要があります。

∂tあなたは=∂バツバツあなたは+b(t、バツ)
バツ∈[−1、1)あなたは参照(t、バツ)=exp⁡(−t)cos⁡(5πバツ)b(t、バツ)=(25π2−1)exp⁡(−t)cos⁡(5πバツ)
clear

% Solve: u_t = u_xx + b
% with periodic boundary conditions

% analytical solution:
uRef = @(t,x) exp(-t)*cos(5*pi*x);
b = @(t,x) (25*pi^2-1)*exp(-t)*cos(5*pi*x);

% grid
N = 30;
x(:,1) = linspace(-1,1,N+1);

% leave off 1 point so initial condition is periodic
% (doesn't have a duplicate point)
x(end) = [];
uWithMatrix = uRef(0,x);
uNoMatrix = uRef(0,x);

dx = diff(x(1:2));
dt = dx.^2/2;

%Iteration matrix:
e = ones(N,1);
A = spdiags([e -2*e e], -1:1, N, N);
A(N,1) = 1;
A(1,N) = 1;
A = A/dx^2;

%indices (left, center, right) for second order centered difference
iLeft = [numel(x), 1:numel(x)-1]';
iCenter = (1:numel(x))';
iRight = [2:numel(x), 1]';

%plot
figure(1)
clf
hold on
h0=plot(x,uRef(0,x),'k--','linewidth',2);
h1=plot(x,uWithMatrix);
h2=plot(x,uNoMatrix,'o');
ylim([-1.2, 1.2])
legend('Analytical solution','Matrix solution','Matrix-free solution')
ht = title(sprintf('Time t = %0.2f',0));
xlabel('x')
ylabel('u')
drawnow

for t = 0:dt:1
    uWithMatrix = uWithMatrix + dt*( A*uWithMatrix + b(t,x) );
    uNoMatrix = uNoMatrix + dt*(  ( uNoMatrix(iLeft) ...
                                - 2*uNoMatrix(iCenter) ...
                                  + uNoMatrix(iRight) )/dx^2 ...
                                + b(t,x) );
    set(h0,'ydata',uRef(t,x))
    set(h1,'ydata',uWithMatrix)
    set(h2,'ydata',uNoMatrix)
    set(ht,'String',sprintf('Time t = %0.2f',t))
    drawnow
end

初期条件のプロット

t = 0.5での解のプロット

t = 1.0での解のプロット

t = 2.0での解のプロット


1
素晴らしくシンプルなソリューション!! ここで誰かがそれを必要とする場合に備えてPython での実装
— -ilciavo

バツ

@ bela83初期条件以外のものを指定する必要がないことは正しいです。そうすると、システムが過剰に決定されます。あなたがする必要があるのは、あなたが定期的に物事を適切にラップすることを確実にするために、間隔の終点の近くで少し注意することです。これを行うには多くの有効な方法があります。
— ダグリピンスキー

-1

これによれば、次のような周期的な境界条件を課す必要があります。

あなたは(0、t)=あなたは(1、t)あなたはバツ(0、t)=あなたはバツ(1、t)

後方オイラーを暗黙的に使用して熱方程式を離散化する1つの方法は、

あなたはn+1−あなたはn△t=あなたは私+1n+1−2あなたは私n+1+あなたは私+1n+1△バツ2

連立方程式を解く

[私−△t△バツ2A][あなたは1n+1あなたは1n+1⋮あなたはNn+1]=[あなたは1nあなたは2n⋮あなたはNn]

A=[−21000…01−2100…001−210…0001−21…00001−2…0⋮⋮⋮⋮⋱⋱⋮000…01−2]

周期境界条件は、さらに2つの方程式と2つの追加(ゴースト)セルを追加することで含めることができます あなたは0 そして あなたはN+1 そのような:

あなたは1−あなたはN=0あなたは2−あなたは02△バツ−あなたはN+1−あなたはN−12△バツ=0

セクション2.11 LeVequeによると、これにより2次精度が得られます。あなたはバツ

最後に、方程式系は次のようになります。

[0100…0−10−1010…10−100000私−△t△バツ2A0000000][あなたは0n+1あなたは1n+1あなたは2n+1あなたはNn+1あなたはN+1n+1]=[00あなたは1nあなたは2nあなたはNn]

これにより、N + 2個の方程式とN + 2個の未知数が得られます。

また、最初の方程式とゴーストセルを取り除き、N個の方程式とN個の未知数のシステムに到達することもできます。


私は声明を理解していません:「2つの追加のセルを追加 あなたは−1 そして あなたはN」 あなたはN すでにポイントです ]0、1[。私は念頭に置いていますバツk=kN+1 そのため バツN=NN+1。
— bela83

インデックス作成の問題です。で始まるN からのセル(またはポイント) あなたは0 に あなたはN−1 そして2つのセルを追加します あなたは−1 そして あなたはN。からのセルがある場合あなたは1 に あなたはN 次に、セルを追加する必要があります あなたは0 そして あなたはN+1
— イルシアボ

OK、それから私はもう2つの方程式を理解しません!最初は(質問からの表記で)あるべきです:あなたは0=あなたはN+1正しい ?しかし、私は2番目のものを理解していません:中心差近似を選択しないのはなぜですか?最後に、それはN+1最初と最後の値が等しい場合、不明。問題の(均一な)ノイマンBCの状況と比較してください。
— bela83

表記を変更しました。それは近似の次数に依存しますあなたはバツ。最初のものはあなたは(0、t)=あなたは(1、t) から2番目 あなたはバツ(0、t)=あなたはバツ(1、t)
— ilciavo

1
u1 = uNは、システムに追加の制限(式u1-uN = 0)を追加します
— ilciavo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.