我一直在尝试构造矩阵Dij,如这张图片所示Dmatrix我想针对区间[-1,1]上位于xi = -cos [pi *(2i + 1)/ 2N]的点绘制它,从而采用函数的导数。我在构建微分矩阵Dij时遇到问题。
我已将python脚本编写为:
import numpy as np
N = 100
x = np.linspace(-1,1,N-1)
for i in range(0, N - 1):
x[i] = -np.cos(np.pi*(2*i + 1)/2*N)
def Dmatrix(x,N):
m_ij = np.zeros(3)
for k in range(len(x)):
for j in range(len(x)):
for i in range(len(x)):
m_ij[i,j,k] = -2/N*((k*np.sin(k*np.pi*(2*i + 1)/2*N(np.cos(k*np.pi*(2*j +1))/2*N)/(np.sin(np.pi*(2*i + 1)/2*N)))
return m_ij
xx = Dmatrix(x,N)
因此返回错误:
IndexError: too many indices for array
有没有一种方法可以更有效地构造它并成功地在所有k上计算?目标是将该矩阵乘以一个函数,然后求和j以获得给定函数的一阶导数。
m_ij = np.zeros(3)
不会构成三维数组,它会构成一维长度为3的数组。
In [1]: import numpy as np
In [2]: m_ij = np.zeros(3)
In [3]: print(m_ij)
[0. 0. 0.]
我怀疑您想要(作为简单的解决方法)
len_x = len(x)
m_ij = np.zeros((len_x, len_x, len_x))
自行查看x
计算
In [418]: N = 10
...: x = np.linspace(-1,1,N-1)
...: y = np.zeros(N)
...: for i in range(N):
...: y[i] = -np.cos(np.pi*(2*i + 1)/2*N)
...:
In [419]: x
Out[419]: array([-1. , -0.75, -0.5 , -0.25, 0. , 0.25, 0.5 , 0.75, 1. ])
In [420]: y
Out[420]: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [421]: (2*np.arange(N)+1)
Out[421]: array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
In [422]: (2*np.arange(N)+1)/2*N
Out[422]: array([ 5., 15., 25., 35., 45., 55., 65., 75., 85., 95.])
我分离了x
和y
,因为否则创建x
然后重写它没有任何意义。
y
值看起来并不有趣,因为它们都只是cos
的奇数整数倍的pi
。
请注意我如何使用np.arange
而不是在range
上循环。