【问题标题】:Is there a way to convert this system into ODEs and solve in python?有没有办法将此系统转换为 ODE 并在 python 中求解?
【发布时间】:2021-08-22 18:51:01
【问题描述】:

我有以下 ODE 系统:(两个变量 Td 和 Ta)。时间步长为delta_t

Td(t+delta_t) = Td(t) + (delta_t * S / (M * C)) * (H * (Ta(t)-Td(t)) - L*P)

Ta(t+delta_t) = Ta(t) + (delta_t * H * S / (A * P)) * (Td(t+delta_t) - Ta(t))

您看到的所有其他字母都可以被视为一个常数,在每个时间步重新计算,取决于 Ta 和 Td。我有 Ta 和 Td 的初始值,我需要看到 Ta、S 和 Td 随时间的演变。

有没有办法将此系统转换为 ODE 并在 python 中求解?感谢您帮助初学者!

【问题讨论】:

  • 欢迎来到 Stack Overflow!通常,您应该在发布问题之前尝试自己解决问题。您能否更详细地说明您要完成的工作?
  • 嗨,我尝试用不同大小的时间步长迭代这个系统,但是系统永远不会收敛并且程序继续运行。有人建议在求解之前将系统转换为 ODE。我试过但无法将其转换为 ODE,因为第二个方程也包含 Td(t+delta_t)。
  • 我投票结束这个问题,因为它是关于数学,而不是编程。
  • 你有任何理由相信所述系统应该收敛吗?这个系统似乎极不可能有一个平衡点。或者常量并不是真正的常量。

标签: python ode


【解决方案1】:

在重新使用新计算值方面,您的系统与 https://math.stackexchange.com/questions/4130422/ode-equivalent-to-a-system-of-difference-equations-discrete-to-continuous-time 具有相似的结构

x(t+dt) = x(t) + dt*f(x(t),y(t))
y(t+dt) = y(t) + dt*g(x(t+dt),y(t))

对于较小的 dt 值,参数中的移位是较低的顺序,因此您只需简单地得到

x'(t) = f(x(t),y(t))
y'(t) = g(x(t),y(t))

作为相应的ODE系统。如果dt 较大,并且您希望通过 ODE 的精确解更接近离散数值解,则需要像链接问题中所做的那样合并额外的泰勒项。得到的修正系统可以写成(所有时间t

x' = f(x-0.5*dt*f(x,y), y-0.5*dt*g(x,y))
y' = g(x+0.5*dt*f(x,y), y-0.5*dt*g(x,y))

系统的行为将真正取决于其他参数是否真的是(正数?)常量或函数,取决于时间t 或另外取决于状态(x,y)(Ta, Td)

在代码中,如果给出了fg

def FG(t,xy,dt):
    x,y = xy
    dx1, dy1 = dt*f(x,y), dt*g(x,y)
    return f(x-0.5*dx1, y-0.5*dy1), g(x+0.5*dx1, y-0.5*dy1)

其中dt 作为常量参数传递(在odeint 或更新的solve_ivpargs 参数中)。


示例: 使用f(x,y)=-4*x+2*y+7g(x,y)=-3*y-x+2dt=0.1,它们在视觉上会聚在t=1.5 周围。比较“partitioned Euler”方法,(f,g) ODE 系统的精确积分和修改后的系统的精确积分得到如下图

x - discrete, dotted - unmodified fg, line - modified FG ODE

正如预期的那样,修改后的系统更忠实于给定的离散方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2022-07-06
    • 1970-01-01
    • 2021-05-15
    • 2021-10-06
    • 2014-12-26
    • 2020-01-24
    相关资源
    最近更新 更多