Я пытаюсь интегрировать матричную функцию в Python, используя функцию scipy quad
. Это подходит для матричной интеграции или есть лучшая функция для использования?
Подынтегральное выражение определяется как:
def integrand(x, W, Omega, omega, K, R):
return np.real(np.dot(W,np.dot(expm(1j*(Omega-omega*np.identity(2))*x+K*x+R*x),np.ones([2,1]))))
, и я интегрирую, используя quad
, следующим образом:
def integral(W, Omega, K, R, omega):
return quad(integrand, 0, np.inf, args=(W, Omega, omega, K, R))[0]
Для указанных значений ввода I проверил, что подынтегральное выражение действительно. Я полагаю, что интеграл существует, но quad возвращает nan
, поэтому мне интересно, если quad
не подходит для такого рода интеграции?
Полный код:
import numpy as np
from scipy.linalg import expm
from scipy.integrate import quad
def integrand(x, W, Omega, omega, K, R):
return np.real(np.dot(W,np.dot(expm(1j*(Omega-omega*np.identity(2))*x+K*x+R*x),np.ones([2,1]))))
def integral(W, Omega, K, R, omega):
return quad(integrand, 0, np.inf, args=(W, Omega, omega, K, R))[0]
Rb = 250
a = 0.5
Rf = 23
k = 200
wf = 250
wb = wf
omega = 0
W = np.array([a,1-a])
Omega = np.array([[wf,0],[0,wb]])
K = np.array([[-k,k],[k,-k]])
R = np.array([[Rf,0],[0,Rb]])
print(integral(W, Omega, K, R, omega))
Результат выглядит следующим образом:
python3.6/site-packages/scipy/integrate/quadpack.py:364: IntegrationWarning: The occurrence of roundoff error is detected, which prevents
the requested tolerance from being achieved. The error may be
underestimated.
warnings.warn(msg, IntegrationWarning)
nan