前提・実現したいこと
ここに質問の内容を詳しく書いてください。
pythonで以下の数値計算
\left{
-\frac{d^2y}{dx^2}+px\frac{dy}{dx}=\lambda*y (0<x<1)
\frac{dy}{dx}(0)=0, y(1)=0
y(x)>0, (0\leq x <1)
という問題を考えています。今,p=20としてこの問題に取り組んでいるのですが,
発生している問題・エラーメッセージ
import numpy as np import scipy.linalg from scipy.special import * import matplotlib.pyplot as plt import sympy as sym sym.symbols("x") delta_x = 0.025 x0, x1 = 0, 1 N=int((x1-x0)/delta_x) print("N=",N) v= np.linspace(-1,1,N) a=v y = np.zeros([N-1,N+1]) dy = sym.diff(y,x) dy[:,0] = 0 y[:,-1] = 0 p=20 A=np.zeros([N-1,N-1]) B=np.identity(N-1) for i in range(N-1): # 3重対角行列なのでindexの位置を気をつけること if i == 0: A[i,i] = 2/(delta_x**2) A[i,i+1] = -1/(delta_x**2)-(p*a[i])/(2*delta_x) elif i == N-2: A[i,i-1] = -1/(delta_x**2)+(p*a[i])/(2*delta_x) A[i,i] = 2/(delta_x**2) else: A[i,i-1] = -1/(delta_x**2)+(p*a[i])/(2*delta_x) A[i,i] = 2/(delta_x**2) A[i,i+1] = -1/(delta_x**2)-(p*a[i])/(2*delta_x) eigen, vec= scipy.linalg.eig(A,B) print("eigen values=",eigen) for j in range(N-1): for i in range(1,N): y[j, i] = vec[i-1,j] X= np.linspace(x0,x1, N+1) plt.plot(X, y[0,:],'-',markersize=5,label='y1') plt.plot(X, y[1,:],'-',markersize=5,label='y2') plt.plot(X, y[2,:],'-',markersize=5,label='y3') plt.legend(loc='upper right') plt.xlabel('X') plt.ylabel('Y') plt.grid(); plt.title("a(x)=x, p=%d"%(p), {"fontsize":25}) plt.show()
該当のソースコード
TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_10976/3986481418.py in <module> 13 y = np.zeros([N-1,N+1]) 14 dy = sym.diff(y,x) ---> 15 dy[:,0] = 0 16 y[:,-1] = 0 17 p=20 TypeError: 'Zero' object does not support item assignment
試したこと
上のコードでは,y(x)>0というコードを打ち込んでいない状況です.改善点などをご教授していただければと思い,投稿させていただきました.何卒よろしくお願いいたします.
補足情報(FW/ツールのバージョンなど)
https://qiita.com/sci_Haru/items/2d238fcadbe7990239df
上記のサイトを参考にさせていただいてます.
独学でpythonの方を勉強しているので,お手柔らかにお願いします.
あなたの回答
tips
プレビュー