为什么Sympy会错误地替换值?

时间:2016-11-16 03:38:07

标签: python sympy equation solver

我有一个简单的等式(f(t) * g(t))^a,其中a是参数,fg是t的函数。我试图复制的方法是

  1. 将表达式与t区分开来,f(t), g(t), f'(t)应该是a * (f(t) * g(t))**(a - 1) * (f'(t) * g(t) + f(t) * g'(t)) 和“g”(t)的表达式。在上面的简单示例中,结果应为

    f(t)
  2. 现在,我们使用了一些关于这个特定问题的知识(经济学中的一个问题),其中仅在一个特定的稳态值,我们知道g(t)的值和f(tss) = 1。假设它们是g(tss) = 100tss,其中tss = 7是稳态值,我将f'(tss)任意设置为g'(tss)。这些不是f和g的一般功能形式

  3. 一旦我们用这些值替换,我们就会得到一个包含两个未知数的等式:scipy.optimize.fsolvefrom sympy import * t = symbols('t') a = symbols('a') f, g = symbols('f g', cls=Function) eq = (f(t) * g(t))**a eq_diff = eq.diff(t) output = eq_diff.evalf(subs={f:1, g:100, a:0.5}) output 的值。在这一点上,它们是否是衍生物并不重要;它们只是未知数,我还有其他方程式,当与这个方程结合时,给我一个非线性系统,我可以使用{{1}}或者一个情绪解算器来解决。

  4. 问题是,我坚持第1步和第2步。下面的代码似乎没有正确地替换这些值。

    {{1}}

    此输出 ![derivatives

    根本不替换这些值。我做错了什么?

    同样,这只是一个微不足道的数学例子,但它很好地证明了这个问题。

3 个答案:

答案 0 :(得分:1)

sympy 1.0 docs显示了多个替换的元组列表:

output = eq_diff.subs([(f, 1), (g, 100), (a, 0.5)])

对我而言,它取代了符号变量 a

为什么期望更换 f,g 函数名称?

答案 1 :(得分:1)

你可以这样做:

fd, gd = symbols('f_d, g_d')   #values of steady-state derivatives
output.subs({f(t).diff(t):fd, g(t).diff(t):gd, f(t):1, g(t):100, a:Rational(1,2)})
  

5*f_d + g_d/20

答案 2 :(得分:0)

仅设置函数名称f不会替换它。您需要完整的表达式,例如{f(t): 1}{f(t).diff(t): 1}(请注意,前者会将导数替换为0)。