] 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を使用する方法を知っています。x1およびxN+2および等式:

u1u12h=0=uN+2uN2h

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

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

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


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

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

回答:


8

これを行う最良の方法は、(あなたが言ったように)周期境界条件の定義を使用し、という事実を使用して最初から方程式を正しく設定することです。実際、さらに強力なのは、周期的な境界条件がx = 0x = 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[バツN2バツ0+バツ1バツ02バツ1+バツ2バツN12バツN+バツ0]

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

tバツ=1バツ2Aバツ
A=[21001121000012110012]

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

tあなたは=バツバツあなたは+btバツ
バツ[11あなたは参照tバツ=exptcos5πバツbtバツ=25π21exptcos5πバツ
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

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

あなたは0t=あなたは1tあなたはバツ0t=あなたはバツ1t

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

あなたはn+1あなたはnt=あなたは+1n+12あなたはn+1+あなたは+1n+1バツ2

連立方程式を解く

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

A=[210000121000012100001210000120000012]

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

あなたは1あなたはN=0あなたは2あなたは02バツあなたはN+1あなたはN12バツ=0

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

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

[0100010101010100000tバツ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 すでにポイントです ]01[。私は念頭に置いていますバツk=kN+1 そのため バツN=NN+1
bela83

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

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

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

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