1

numpy 配列で値の加重合計を取得する最も簡単で最速の方法は何ですか?

例: オイラー法で熱方程式を解く

length_l=10
time_l=10
u=zeros((length_l,length_l))# (x,y)
u[:, 0]=1
u[:,-1]=1
print(u)
def dStep(ALPHA=0.1):
    for position,value in ndenumerate(u):
        D2u= (u[position+(1,0)]-2*value+u[position+(-1, 0)])/(1**2) \
            +(u[position+(0,1)]-2*value+u[position+( 0,-1)])/(1**2)
        value+=ALPHA*D2u()
while True:
    dStep()
    print(u)

D2uは、2 次元での 2 番目の中央の違いである必要があります。のようなインデックスを追加できれば、これは機能します(1,4)+(1,3)=(2,7)。残念ながら、python はそれらを として追加します(1,4)+(1,3)=(1,4,1,3)

計算D2uは、現在の位置を中心とするこのカーネルでドット積を取得することと同等であることに注意してください。

 0, 1, 0
 1,-4, 1
 0, 1, 0

これを内積としてベクトル化できますか?

4

1 に答える 1

3

次のようなものが欲しいと思います:

import numpy as np
from scipy.ndimage import convolve

length_l = 10
time_l = 10
u = np.zeros((length_l, length_l))# (x,y)
u[:,  0] = 1
u[:, -1] = 1

alpha = .1
weights = np.array([[ 0,  1,  0],
                    [ 1, -4,  1],
                    [ 0,  1,  0]])

for i in range(5):
    u += alpha * convolve(u, weights)
    print(u)

次のようにすることで、少し減らすことができます。

weights = alpha * weights
weights[1, 1] = weights[1, 1] + 1

for i in range(5):
    u = convolve(u, weights)
    print(u)
于 2013-02-10T18:45:14.870 に答える