6

以下のコードは、初期条件10 * np.sin(np.pi * x)で両端がゼロ温度に保たれているロッドを表す1D熱方程式を解きます。

この計算では、ディリクレ境界条件(両端の温度がゼロ)はどのように機能しますか?行列Aの上下の行には、ゼロ以外の2つの要素が含まれており、欠落している3番目の要素ディリクレ条件であると言われました。しかし、この条件がどのメカニズムで計算に影響するのかわかりません。Aに要素がない場合、u_{0}またはu_{n}をゼロにするにはどうすればよいですか?

以下の有限差分法では、Crank-Nicholsonを使用しています。

import numpy as np
import scipy.linalg

# Number of internal points
N = 200

# Calculate Spatial Step-Size
h = 1/(N+1.0)
k = h/2

x = np.linspace(0,1,N+2)
x = x[1:-1] # get rid of the '0' and '1' at each end

# Initial Conditions
u = np.transpose(np.mat(10*np.sin(np.pi*x)))

# second derivative matrix
I2 = -2*np.eye(N)
E = np.diag(np.ones((N-1)), k=1)
D2 = (I2 + E + E.T)/(h**2)

I = np.eye(N)

TFinal = 1
NumOfTimeSteps = int(TFinal/k)

for i in range(NumOfTimeSteps):
    # Solve the System: (I - k/2*D2) u_new = (I + k/2*D2)*u_old
    A = (I - k/2*D2)
    b = np.dot((I + k/2*D2), u)
    u = scipy.linalg.solve(A, b)
4

2 に答える 2

5

簡単な例を見てみましょう。つまり、3つの内部点を想定していますが、最初に、近似二階導関数を記述するN = 3行列に境界点も含めます。D2

      1  /  1 -2  1  0  0 \
D2 = --- |  0  1 -2  1  0 |
     h^2 \  0  0  1 -2  1 /

最初の行は、での近似二階導関数がでx_1あるということを意味し1/h^2 * (u_0 - 2*u_1 + u_2)ます。u_0 = 0ただし、ディリクレ境界条件が均一であるため、方程式から単純に省略でき、eは行列に対して同じ結果を得ることができます。

      1  /  0 -2  1  0  0 \
D2 = --- |  0  1 -2  1  0 |
     h^2 \  0  0  1 -2  0 /

u_0とは実際の未知数ではないため(u_{n+1}ゼロであることがわかっています)、マトリックスから完全に削除できます。

      1  /  2  1  0 \
D2 = --- |  1 -2  1 |
     h^2 \  0  1 -2 /

行列に欠落しているエントリは、境界条件がゼロであるという事実に実際に対応しています。

于 2011-01-30T13:39:32.247 に答える
0

行列Aの上下の行には2つの非ゼロ要素が含まれており、欠落している3番目の要素(つまりゼロ)はディリクレ条件であると言われました。

あなたが何を言われたかはわかりませんが、この問題について私が知っていることは次のとおりです。

ディリクレ境界条件は、ポテンシャルの値(この場合は温度)を固定します。ノイマン境界条件は、ある点での流束または一次導関数を指定します。サーフェスに対流境界条件がある場合は、これが必要になります。

ディリクレ境界条件の処理に関しては、最初に境界条件を考慮せずにシステム行列を定式化します。特定のノードの温度が固定されている場合は、次のように処理できます。

  1. 指定されたノードの右側のベクトルの行を境界温度に等しく設定します。左側の行列のその行のすべての列をゼロにし、そのノードに対応する対角要素を1に設定します。
于 2011-01-30T13:40:59.100 に答える