Sympy dsolve的答案取决于输入的顺序?

时间:2018-02-23 13:46:54

标签: python sympy

为什么同情的dsolve函数给出的答案取决于给出方程的顺序?

这个顺序(x,然后是y,然后是z):

    k2, k3, t = symbols('k2 k3 t')
    x,y,z = symbols('x y z', function=True)

    eq = (Eq(Derivative(x(t),t), k3*y(t)), Eq(Derivative(y(t),t), -(k3+k2)*y(t)), Eq(Derivative(z(t),t), k2*y(t)))
    dsolve(eq)

给出:

   [Eq(x(t), C1 + C2*t + C3*k3*exp(t*(-k2 - k3))/k2), Eq(y(t), -C3*(k2 + k3)*exp(t*(-k2 - k3))/k2), Eq(z(t), C2 + C3*exp(t*(-k2 - k3)))]

但是当eq的顺序改变时(第一个z,然后是x,然后是y):

    k2, k3, t = symbols('k2 k3 t')
    x,y,z = symbols('x y z', function=True)

    eq = (Eq(Derivative(z(t),t), k2*y(t)), Eq(Derivative(x(t),t), k3*y(t)), Eq(Derivative(y(t),t), -(k3+k2)*y(t)))

    dsolve(eq, ics={z(0):0, x(0):0, y(0):1})

答案是不同的。

[Eq(z(t), C1 + C2*t - C3*k2*exp(t*(-k2 - k3))/(k2 + k3)), Eq(x(t), C2 - C3*k3*exp(t*(-k2 - k3))/(k2 + k3)), Eq(y(t), C3*exp(t*(-k2 - k3)))]

除此之外,dsolve在两种情况下都给出了不正确的答案。特别是常数C1,C2和C3不正确。给出初始条件为ics = {x(0):0,y(0):1,...等不会起作用或影响答案。

1 个答案:

答案 0 :(得分:1)

显然,这类系统的求解器的逻辑是不正确的;我raised an issue

除此之外:微分方程组解的常数可以用多种方式表示,它们没有单一的规范形式。可以预期,呈现方程的顺序将影响它们的处理顺序(就像线性方程组一样),这将影响解的形式。

但是,正如你所指出的,两种解决方案都不正确。这可以通过插入来检查:

eq1 = (Eq(Derivative(x(t),t), k3*y(t)), Eq(Derivative(y(t),t), -(k3+k2)*y(t)), Eq(Derivative(z(t),t), k2*y(t)))
sol1 = dsolve(eq1)
print([eqn.subs({e.lhs: e.rhs for e in sol1}).doit().simplify() for eqn in eq1])
eq2 = (Eq(Derivative(z(t),t), k2*y(t)), Eq(Derivative(x(t),t), k3*y(t)), Eq(Derivative(y(t),t), -(k3+k2)*y(t)))
sol2 = dsolve(eq2)
print([eqn.subs({e.lhs: e.rhs for e in sol2}).doit().simplify() for eqn in eq2])

第一次打印

[Eq(C3*k3*(k2 + k3)*exp(-t*(k2 + k3))/k2, -(C2*k2*exp(t*(k2 + k3)) - C3*k3*(k2 + k3))*exp(-t*(k2 + k3))/k2),
 True,
 True]

表示满足第2和第3个方程,但第1个方程不满足。

第二次打印

[Eq(C3*k2*exp(-t*(k2 + k3)), C2 + C3*k2*exp(-k2*t)*exp(-k3*t)), True, True]

所以再一次,第一个方程式无法正确解决,即使它现在是另一个方程式。

  

给出初始条件为ics = {x(0):0,y(0):1,......等不会起作用或影响答案。

在SymPy 1.1.1发布后添加了对初始条件的支持。他们在development version工作,并将在SymPy 1.2+中工作。