sympy dsolve返回错误答案

时间:2018-01-16 22:19:20

标签: sympy symbolic-math ode dsolve

我正在使用sympy.dsolve为衰变链解决一个简单的ODE。 我得到的不同衰减率(例如lambda_1> lambda_2)的答案是错误的。在替换C1 = 0之后,我得到一个简单的指数

-N_0*lambda_1*exp(-lambda_1*t)/(lambda_1 - lambda_2)

而不是正确答案:

(exp(-lambda_1*t)-exp(-lambda_2*t)).

我做错了什么? 这是我的代码

sp.var('lambda_1,lambda_2 t')
sp.var('N_0')
daughter = sp.Function('N2',Positive=True)(t)

stage1 = N_0*sp.exp(-lambda_1*t)
eq = sp.Eq(daughter.diff(t),stage1*lambda_1 - daughter*lambda_2)

sp.dsolve(eq,daughter)

2 个答案:

答案 0 :(得分:0)

您的微分方程是(使用较短的变量标识符)

y' = A*N0*exp(-A*t) - B*y

应用积分因子exp(B*t)以获得等效值

(exp(B*t)*y(t))' = A*N0*exp((B-A)*t)

整合以获得

exp(B*t)*y(t) = A*N0*exp((B-A)*t)/(B-A) + C

y(t) = A*N0*exp(-A*t)/(B-A) + C*exp(-B*t)

这正是求解器计算出来的。

答案 1 :(得分:0)

您是否插入C1 = 0,期望获得y(0)= 0的解决方案?这不是它的工作原理。 C1是公式中的任意常数,将其设置为0并不保证当t = 0时表达式将计算为0.

这是一个正确的方法,一步一步

sol1 = sp.dsolve(eq, daughter)  

这会返回Piecewise,因为不知道两个lambda是否相等:

Eq(N2(t), (C1 + N_0*lambda_1*Piecewise((t, Eq(lambda_2, lambda_1)), (-exp(lambda_2*t)/(lambda_1*exp(lambda_1*t) - lambda_2*exp(lambda_1*t)), True)))*exp(-lambda_2*t))

我们可以澄清它们不是:

sol2 = sol1.subs(Eq(lambda_2, lambda_1), False)

获得

Eq(N2(t), (C1 - N_0*lambda_1*exp(lambda_2*t)/(lambda_1*exp(lambda_1*t) - lambda_2*exp(lambda_1*t)))*exp(-lambda_2*t))

接下来,我们需要C1,当t = 0时,右侧变成0。所以,在右侧,插入0表示t,求解C1:

C1 = Symbol('C1')
C1val = solve(sol2.rhs.subs(t, 0), C1, dict=True)[0][C1]

(没有必要包含dict=True,但我喜欢它,因为它强制执行solve的统一输出:它是一个字典数组。)

顺便说一下,C1val现在是N_0*lambda_1/(lambda_1 - lambda_2)。把它放进去:

sol3 = sol2.subs(C1, C1val).simplify()

你有它:

Eq(N2(t), N_0*lambda_1*(exp(lambda_1*t) - exp(lambda_2*t))*exp(-t*(lambda_1 + lambda_2))/(lambda_1 - lambda_2))

表达式相当于N_0*lambda_1*(exp(-lambda_2*t) - exp(-lambda_1*t))/(lambda_1 - lambda_2),尽管SymPy似乎不愿意在这里组合指数。