Я пытаюсь взять производные, используя дифференцирующую матрицу. Теперь, когда мне удалось получить матрицу дифференцирования, я не могу вычислить производные. Примечание, которое я ранее спрашивал: Построение матрицы многомерного дифференцирования
Мой текущий код выглядит следующим образом
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.
Я не уверен, почему это происходит. Любые идеи приветствуются.