【发布时间】:2020-10-25 03:53:36
【问题描述】:
我正在尝试解决以下系统:d²i/dt² + R'(i)/L di/dt + 1/LC i(t) = 1/L dE/dt 作为一组耦合的一阶微分方程:
- di/dt = k
- dk/dt = 1/L dE/dt - R'(i)/L k - 1/LC i(t)
这是我正在使用的代码:
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 造成的问题?
【问题讨论】:
-
您希望从
odeint电话中得到什么?odeint进行数值积分。在numpy/scipy代码中使用sympy对象的能力非常有限。在您成为两者的专家之前,请勿混合使用它们。 -
@hpaulj 我希望使用
odeint解决i。我的想法是绘制和可视化系统的响应。 -
当你询问一个节目时 whole 错误。不知道哪里出错了。
-
不要混合使用变量名。如果
i,t是符号,请不要将它们用作数值变量。
标签: python numpy scipy sympy odeint