我有一组相对简单但非线性的两个变量的微分方程:
我认为这可能有一个分析解决方案,所以我尝试在 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)))
我无法破译这个...
这个解决方案是否有明显的简化,可以在我感兴趣的某些条件下工作,或者它真的是这个复杂的分段函数吗?
实际上,分段解的原因是很明显的。当
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)))
不确定这是否可以进一步简化,但它符合我正在寻找的内容。