Ошибка реализации дифференцирующей матрицы с использованием numpy - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь взять производные, используя дифференцирующую матрицу. Теперь, когда мне удалось получить матрицу дифференцирования, я не могу вычислить производные. Примечание, которое я ранее спрашивал: Построение матрицы многомерного дифференцирования

Мой текущий код выглядит следующим образом

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.

Я не уверен, почему это происходит. Любые идеи приветствуются.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Когда я добавляю print к вашему коду:

            print(i,j, k, x[j])
            fprime[j] += f[x[j]]*m_ij[i,j,k]

1531:~/mypy$ python3 stack59759031.py 
0 0 0 -0.8390715290764524
Traceback (most recent call last):
  File "stack59759031.py", line 25, in <module>
    dij,fprime = Dmatrix(N,f1) 
  File "stack59759031.py", line 22, 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

Итак, x[j] - это значение с плавающей запятой, которое не является допустимым индексом!

0 голосов
/ 16 января 2020

Изменение

fprime [j] + = f [x [j]] * m_ij [i, j, k]

К

fprime [j] + = f [x [0]] * m_ij [i, j, k]

Выведены следующие три изображения

enter описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Не уверен, что это то, что Вы ищете?

...