如何使用scipy odeint求解该微分方程? [英] How to solve this differential equation using scipy odeint?
本文介绍了如何使用scipy odeint求解该微分方程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用scipy odeint求解以下微分方程,但没有取得很大的成功:
I am trying to solve the following differential equation using scipy odeint without much success:
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.
我应该怎么做才能正确运行脚本?
What should I do to run the script without errors?
推荐答案
此功能有问题:
def L(B):
return derivative(B,Ip(t))*377.2
请注意,t
指的是之前定义的全局变量,它是一个numpy数组.我认为您需要重新考虑如何定义函数及其参数-t
是否也应作为L
的参数?实际上,f
返回一个包含数组的列表,即使其第一个参数包含单个元素也是如此:
Note that t
refers to the global variable defined earlier, which is a numpy array. I think you need to rethink how you define your functions and their arguments--should t
also be an argument to L
? As it is, f
returns a list containing an array, even when its first argument contains a single element:
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
损坏.
这篇关于如何使用scipy odeint求解该微分方程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文