我试图将以下系统作为一组耦合的一阶微分方程来求解:d²I/dt²+R'(I)/L di/dt+1/LC I(t)=1/L dE/dt:
以下是我正在使用的代码:
import numpy as np
import sympy as sp
import matplotlib.pyplot as plt
from scipy.integrate import odeint
#Define model: x = [i , k]
def RLC(x , t):
i = sp.Symbol('i')
t = sp.Symbol('t')
#Data:
E = sp.ln(t + 1)
dE_dt = E.diff(t)
R1 = 1000 #1 kOhm
R2 = 100 #100 Ohm
R = R1 * i + R2 * i**3
dR_di = R.diff(i)
i = x[0]
k = x[1]
L = 10e-3 #10 mHy
C = 1.56e-6 #1.56 uF
#Model
di_dt = k
dk_dt = 1/L * dE_dt - dR_di/L * k - 1/(L*C) * i
dx_dt = np.array([di_dt , dk_dt])
return dx_dt
#init cond:
x0 = np.array([0 , 0])
#time points:
time = np.linspace(0, 30, 1000)
#solve ODE:
x = odeint(RLC, x0, time)
i = x[: , 0]
但是,我得到以下错误:TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'
所以,我不知道sympy
和odeint
是否配合得不好。或者可能是因为我将t
定义为sp.Symbol
而产生了问题
当你区分一个函数时,你会得到一个函数。所以你需要在某一点上对它求值,才能得到一个数字。要计算symphy表达式,可以使用
.subs()
,但我更喜欢感觉更强大的.replace()
(至少对我来说)您必须尝试使每个变量都有自己的名称,以避免混淆。例如,从一开始就将浮点输入
t
替换为sympySymbol
,从而丢失t
的值。变量x
和i
也在外部范围内重复,如果它们的含义不同,这是不好的做法以下内容应避免混淆,并有望产生您期望的结果:
需要注意的是:值
i = x[0]
似乎在每次迭代中都非常接近于0。这意味着dR_di
在整个时间里基本上停留在1000
。我不熟悉odeint
或您的特定ODE,但希望这种现象是意料之中的,不是问题相关问题 更多 >
编程相关推荐