Как решить это дифференциальное уравнение используя scipy odeint?
Я пытаюсь решить следующее дифференциальное уравнение, используя scipy odeint без особого успеха:
import numpy as np
from scipy.misc import derivative
from scipy.integrate import odeint
Imag = 16000.
w = 2*np.pi*60
tau = .05
theta = 1.52
phi = theta - np.radians(90)
t = np.linspace(0,.1,10000)
def Ip(t):
return np.sqrt(2)*Imag*(np.sin(w*t+phi-theta)-np.exp(-t/tau)*np.sin(phi-theta))
B = lambda Ip: Ip/(53.05+0.55*abs(Ip))
def L(B):
return derivative(B,Ip(t))*377.2
def dI(t):
return derivative(Ip,t)
def f(y,t):
Rb = 8.
N = 240.
Is = y[0]
f0 = (1/(L(B)+0.002))*((dI(t)*L(B)/N)-Rb*y[0])
return [f0]
yinit = [0]
sol = odeint(f,yinit,t)
print sol[:,0]
Я продолжаю получать следующую ошибку:
odepack.error: Result from function call is not a proper array of floats.
ValueError: object too deep for desired array
odepack.error: Result from function call is not a proper array of floats.
Что я должен сделать, чтобы запустить скрипт без ошибок?
2 ответа
Как насчет использования ode
вместо odeint
Ваш вопрос довольно похож: как добиться успеха?
У вас есть проблема с этой функцией:
def L(B):
return derivative(B,Ip(t))*377.2
Обратите внимание, что t
ссылается на глобальную переменную, определенную ранее, которая является пустым массивом. Я думаю, что вам нужно переосмыслить, как вы определяете свои функции и их аргументы - следует t
также быть аргументом L
? Как это, f
возвращает список, содержащий массив, даже если его первый аргумент содержит единственный элемент:
In [10]: f([1], 0)
Out[10]:
[array([ -2.28644086e+10, -2.28638809e+10, -2.28633064e+10, ...,
-1.80290012e+09, -1.80271510e+09, -1.80258446e+09])]
Это приведет к odeint
сломать.