为什么 Sympy 会错误地替换值?
Why does Sympy substitute values incorrectly?
我有一个像 (f(t) * g(t))^a
这样的简单方程,其中 a
是一个参数,f
和 g
是 t 的函数。我试图复制的方法是
求t
的表达式,应该是f(t), g(t), f'(t)
和`g'(t)的表达式。在上面的简单例子中,结果应该是
a * (f(t) * g(t))**(a - 1) * (f'(t) * g(t) + f(t) * g'(t))
现在,我们使用这个特定问题(经济学问题)的一些知识,其中仅在一个特定的稳态值,我们知道值f(t)
和 g(t)
。假设它们是 f(tss) = 1
和 g(tss) = 100
,其中 tss
是稳态值,我将任意设置为 tss = 7
。这些 不是 f 和 g 的一般函数形式。
代入这些值后,我们得到一个包含两个未知数的方程式: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)。
我有一个像 (f(t) * g(t))^a
这样的简单方程,其中 a
是一个参数,f
和 g
是 t 的函数。我试图复制的方法是
求
t
的表达式,应该是f(t), g(t), f'(t)
和`g'(t)的表达式。在上面的简单例子中,结果应该是a * (f(t) * g(t))**(a - 1) * (f'(t) * g(t) + f(t) * g'(t))
现在,我们使用这个特定问题(经济学问题)的一些知识,其中仅在一个特定的稳态值,我们知道值
f(t)
和g(t)
。假设它们是f(tss) = 1
和g(tss) = 100
,其中tss
是稳态值,我将任意设置为tss = 7
。这些 不是 f 和 g 的一般函数形式。代入这些值后,我们得到一个包含两个未知数的方程式:
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)。