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

Why does Sympy substitute values incorrectly?

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

  1. t的表达式,应该是f(t), g(t), f'(t)和`g'(t)的表达式。在上面的简单例子中,结果应该是

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

  3. 代入这些值后,我们得到一个包含两个未知数的方程式:f'(tss)g'(tss) 的值。在这一点上,它们是否是衍生品并不重要;它们只是未知数,我有其他方程式,当与这个方程式结合时,给我一个非线性系统,我可以使用 scipy.optimize.fsolve 或 sympy 的求解器之一来求解。

问题是,我卡在了第 1 步和第 2 步。下面的代码似乎没有正确替换值。

from 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

这输出

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

同样,这只是一个简单的数学示例,但它很好地说明了问题。

sympy 1.0 文档显示多个替换的元组列表:

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

这对我来说代替了符号变量 a

为什么要替换 f、g 函数名称?

你可以这样做:

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

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