这个用户定义的函数如何与 scipy 集成 odeint 一起工作?
How does this user-defined function work with scipy integrate odeint?
我正在从事一个电气工程项目,我们将 RLC 电路中电容器上的电压绘制为时间的函数。我的代码基于以下教程:Python-ODE for RLC Circuit。我的代码功能齐全,但我只是想更好地了解用户定义函数和 SciPy 集成函数的工作原理。我已阅读文档,但仍有一些具体问题。这是我的代码:
from scipy.integrate import odeint # for integrating ode
import matplotlib.pyplot as plt # for plotting commands
import numpy as np #For loadtxt and linspace modules
R,L,C,tl,numplot = np.loadtxt('UserInput_RLC_Values.txt',unpack=True)
def RLC(A,t):
Vc,m=A
V = 2.0 #voltageSource
res=[m,(V-Vc-(m*R*C))/(L*C)]
return res
time = np.linspace(0.0,tl,numplot)
vc,m = odeint(RLC,[0.0,0.0],time).T
这是我的问题:
- 参数值A和t在函数RLC中起什么作用?为什么将 A 分配给 Vc(电容器电压)和 m(v' 的虚拟变量)?连t都用了吗?
- 当我在 odeint 模块中调用 RLC 函数时,为什么没有任何参数?
- odeint模块末尾的.T是什么意思?我在文档中找不到任何相关信息。
感谢您对此的任何见解。我希望这不是一个懒惰的问题,但我认为充分理解这对我有很大帮助。
传递给 odeint
的 ODE 函数需要采用 f(state, time)
格式,其中 time
是自变量,state
是状态向量。对应的(向量值)微分方程为y'(t)=f(y(t),t)
) 对于标准 ODE 求解器,您需要将高阶方程转换为一阶方程组。这里使用 m
作为动量 (?) 变量,m = dVc/dt
。那么dm/dt = d²Vc/dt²
就是二阶导数。
如果输入是 state = [ Vc, m ]
,输出需要是 [ dVc/dt, dm/dt ] = [ m, Eqn(t,Vc,m) ]
,其中 d²Vc/dt² = Eqn(t,Vc,dVc/dt)
是原始方程的一种形式。
t
只需要出现在参数列表中,即使 ODE 是时不变的。
) 您将函数作为 reference/address 传递,而不是函数值
)表示"transpose"。 odeint
的结果是状态向量列表,它们是数字对。将其转置将其转换为一对可以分配给一对变量的列表。
我正在从事一个电气工程项目,我们将 RLC 电路中电容器上的电压绘制为时间的函数。我的代码基于以下教程:Python-ODE for RLC Circuit。我的代码功能齐全,但我只是想更好地了解用户定义函数和 SciPy 集成函数的工作原理。我已阅读文档,但仍有一些具体问题。这是我的代码:
from scipy.integrate import odeint # for integrating ode
import matplotlib.pyplot as plt # for plotting commands
import numpy as np #For loadtxt and linspace modules
R,L,C,tl,numplot = np.loadtxt('UserInput_RLC_Values.txt',unpack=True)
def RLC(A,t):
Vc,m=A
V = 2.0 #voltageSource
res=[m,(V-Vc-(m*R*C))/(L*C)]
return res
time = np.linspace(0.0,tl,numplot)
vc,m = odeint(RLC,[0.0,0.0],time).T
这是我的问题:
- 参数值A和t在函数RLC中起什么作用?为什么将 A 分配给 Vc(电容器电压)和 m(v' 的虚拟变量)?连t都用了吗?
- 当我在 odeint 模块中调用 RLC 函数时,为什么没有任何参数?
- odeint模块末尾的.T是什么意思?我在文档中找不到任何相关信息。
感谢您对此的任何见解。我希望这不是一个懒惰的问题,但我认为充分理解这对我有很大帮助。
传递给 odeint
的 ODE 函数需要采用 f(state, time)
格式,其中 time
是自变量,state
是状态向量。对应的(向量值)微分方程为y'(t)=f(y(t),t)
) 对于标准 ODE 求解器,您需要将高阶方程转换为一阶方程组。这里使用
m
作为动量 (?) 变量,m = dVc/dt
。那么dm/dt = d²Vc/dt²
就是二阶导数。如果输入是
state = [ Vc, m ]
,输出需要是[ dVc/dt, dm/dt ] = [ m, Eqn(t,Vc,m) ]
,其中d²Vc/dt² = Eqn(t,Vc,dVc/dt)
是原始方程的一种形式。t
只需要出现在参数列表中,即使 ODE 是时不变的。) 您将函数作为 reference/address 传递,而不是函数值
)表示"transpose"。
odeint
的结果是状态向量列表,它们是数字对。将其转置将其转换为一对可以分配给一对变量的列表。