这个二变量 ODE 有简单的解析解吗? (使用 Sympy)

问题描述 投票:0回答:1

我有一组相对简单但非线性的两个变量的微分方程:

  1. dx[1]/dt = (u[1] - u[3]) / A
  2. dx[2]/dt = u[1] * u[2] - u[3] * x[2] / (x[1] * A)

我认为这可能有一个分析解决方案,所以我尝试在 Sympy 中解决它,如下此处发布的示例

from sympy import symbols, Function, Eq, dsolve

x1, x2 = symbols('x1, x2', cls=Function)
t, u1, u2, u3, A, x1_init, x2_init = symbols('t, u1, u2, u3, A, x1_init, x2_init')

ode_system = [
    Eq(x1(t).diff(t), (u1 - u3)  /  A), 
    Eq(x2(t).diff(t), u1 * u2 - u3 * x2(t)  /  (x1(t) * A))
]
ics = {x1(0): x1_init, x2(0): x2_init}

sol = dsolve(ode_system, [x1(t), x2(t)], ics=ics)

Sympy 事实上确实找到了解决方案。

x1(t)
的解与预期一致,但是
x2(t)
的积分非常复杂,并且包含一个
Piecewise
函数:

In [2]: sol[0]
Out[2]: Eq(x1(t), x1_init + t*(u1 - u3)/A)

In [3]: sol[1]
Out[3]: Eq(x2(t), u1*u2*Piecewise((exp(u1*log(A*x1_init + t*u1 - t*u3)/(u1 - u3))/u1, Ne(u1, 0)), (log(A*x1_init + t*u1 - t*u3)/(u1 - u3), True))*exp(-u3*log(A*x1_init + t*u1 - t*u3)/(u1 - u3)) - (u1*u2*Piecewise((exp(u1*log(A*C1)/(u1 - u3))/u1, Ne(u1, 0)), (log(A*C1)/(u1 - u3), True)) - x2_init*(A*x1_init)**(u3/(u1 - u3)))*exp(-u3*log(A*x1_init + t*u1 - t*u3)/(u1 - u3)))

我无法破译这个...

这个解决方案是否有明显的简化,可以在我感兴趣的某些条件下工作,或者它真的是这个复杂的分段函数吗?

python sympy ode symbolic-math integral
1个回答
0
投票

实际上,分段解的原因是很明显的。当

Ne(u1, 0))
时出现一些子解,我认为这意味着“if u1 != 0”。

我碰巧知道

u1
不是负数,所以我尝试将其指定为假设,结果要简单得多:

u1 = Symbol('u1', positive=True)

那么,第二个积分的解为:

In [17]: sol[1]
Out[17]: Eq(x2(t), u2*(A*x1_init + t*u1 - t*u3) - (u2*exp(u1*log(A*C1)/(u1 - u3)) - x2_init*(A*x1_init)**(u3/(u1 - u3)))*exp(-u3*log(A*x1_init + t*u1 - t*u3)/(u1 - u3)))

不确定这是否可以进一步简化,但它符合我正在寻找的内容。

© www.soinside.com 2019 - 2024. All rights reserved.