【发布时间】:2020-01-15 20:23:45
【问题描述】:
我正在尝试使用微分矩阵求导数。 现在设法获得微分矩阵,我无法计算导数。 注意我之前问过: Constructing a Multidimensional Differentiation Matrix
我目前的代码如下
import numpy as np
import matplotlib.pyplot as plt
import math
N = 20
x = np.linspace(-1,1,N)
f1 = np.sin(3*x) # exact function
df1 = 3*np.cos(3*x) # exact derivative for comparison sake
def Dmatrix(N,f):
m_ij = np.zeros((N,N,N))
fprime = np.zeros(N)
for i in range(0,N-1):
x = np.cos([(2*i + 1)/2*N])
for j in range(0,N-1):
for k in range(0,N-1):
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)))
fprime[j] += f[x[j]]*m_ij[i,j,k]
return m_ij,fprime
dij,fprime = Dmatrix(N,f1)
plt.plot(x,f1,'b')
plt.show()
plt.plot(x,fprime,'k')
plt.show()
plt.plot(x,df1,'r')
plt.show()
不幸的是,我得到了错误:
File "/home/~", line 20, in Dmatrix
fprime[j] += f[x[j]]*m_ij[i,j,k]
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
注意修改后的Dmatrix函数没有搭配点x,代码如下:
def Dmatrix(N,f):
m_ij = np.zeros((N,N,N))
fprime = np.zeros(N)
for i in range(N):
for j in range(N):
for k in range(N):
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)))
fprime[j] += f(x[j])*m_ij[i,j,k]
return m_ij,fprime
这为 fprime 提供了精确解 f1 的类似图,这是错误的,因为我想获得精确解的导数,即 df1。
我不知道为什么会这样。 欢迎任何想法。
【问题讨论】:
-
那么您检查问题行中的索引了吗?
j、x[j]和i,j,k是什么?您有运行到该点的代码。我也许可以复制粘贴并自己找出来,但如果你自己检查就好了! -
好的,我能够运行您的代码并进行诊断打印。由此可见,
x[j]不是有效索引! -
还要注意
x的形状为(1,),因此对于任何大于2的N,即使进行更正也会失败
标签: python numpy for-loop matplotlib numeric