0

有限差分法を使用して、Python で反復計算を実行しようとしています。これから有限差分法を見つけました:

http://depa.fquim.unam.mx/amyd/archivero/DiferenciasFinitas3_25332.pdf

コードが計算する値は正しいです。問題は、最終的な値しか表示されていないことです。私が望むのは、x 方向の任意の点の値を抽出してプロットできるようにすることと、任意の時点での値 (計算の途中の点の値など) を抽出することです。これは反復計算を行う正しい方法ですか? コードを以下に示します。

import numpy as np
import scipy as sp
import time
import matplotlib as p
L=0.005
Nx=3
T=5
N1=5
k=0.5
rho=1200
c=1000
a=(k/(rho*c))
x = np.linspace(0, L, Nx+1)   # mesh points in space
dx = x[1] - x[0]
t = np.linspace(0, T, N1)    # time
dt = t[1] - t[0]
toutside=5
Coefficient = a*dt/dx**2
bi=0.5
ui = sp.zeros(Nx+1)
u = sp.zeros(Nx+1)
for i in range(Nx+1):
  ui[i] = 50 # initial values

for n in range(0, N1):

   for i in range(0,1):
      u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i]
   for i in range(1,Nx):
      u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i]
   for i in range(Nx,Nx+1):
      u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i]
      ui[:]= u #updates matrix for next loop
 print ui

danodonovan の回答に基づいてコードを次のように変更しました。

for n in range(0, N1):

for i in range(0,1):
    u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i]
for i in range(1,Nx):
    u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i]
for i in range(Nx,Nx+1):
    u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i]
    ui=u
    a=list(ui)

print a

リスト全体をループから外そうとすると、最終的な値だけが生成されます。リスト全体を抽出するにはどうすればよいですか? これは、前の行の値を使用して新しい行の値を計算する反復計算を行う正しい方法ですか?

4

2 に答える 2

0

(私があなたの質問を正しく理解していればmatplotlib

 import matplotlib as p

 # and after your loop has completed

 p.pyplot.plot(range(0, N1), ui, 'o-')
 p.pyplot.show()

uに対するデータの簡単なプロットを取得しますrange(0, N1)

uiあなたが何を期待しているのかはわかりません.toのui[:]= uコピーを設定しますが、作成中のコピーを保持uiuません。uiui[:]

ui[:]ヒント: と同じと考えてください。list(ui)

于 2013-05-30T13:52:52.743 に答える
0

スターター インデントの場合、 for allprint uiの値を表示します。次に、結果をリストに追加します。uiN1

res = []
for n in range(0, N1):

   for i in range(0,1):
      u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i]
   for i in range(1,Nx):
      u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i]
   for i in range(Nx,Nx+1):
      u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i]
      ui[:]= u #updates matrix for next loop
   print ui
   res.append(ui.copy())

print res

次の結果が生成されます。

[array([ 41.5625,  50.    ,  50.    ,  50.    ]),
 array([ 37.87109375,  48.41796875,  50.        ,  50.        ]),
 array([ 35.6628418 ,  46.73706055,  49.70336914,  50.        ]),
 array([ 34.06639099,  45.21682739,  49.20280457,  49.88876343]),
 array([ 32.79785633,  43.87349129,  48.58405113,  49.63152885])]
于 2013-05-30T14:14:04.207 に答える