以下代码意外地将 f(1)=xf(0) 简化为 f(1)=0。是因为没有进一步假设就不能使用未定义的函数吗?
运行此命令不应更改表达式,但它会给出
Eq(f(1), 0)
from sympy import *
x, y = symbols("x y")
f = Function("f")
print(Eq(f(1), x * f(0)).simplify(rational=True, doit=False))
你是对的,sympy 在简化涉及未知函数的表达式时存在局限性。 问题在于 sympy 假定任何未定义的函数在 0 处的值为 0。 这种假设在一般情况下是不正确的,并且会导致你的示例中出现意外的简化。
以下是代码中发生的事情的细分:
-
f = Function("f")
创建一个名为f
的未定义函数。 -
Eq(f(1), x*f(0))
创建了一个方程式,表示f(1)
等于x
乘以f(0)
。 -
当你调用
.simplify()
时,sympy 会(错误地)假设f(0) = 0
。 -
此假设会导致方程式简化为
f(1) = x * 0
,进而简化为f(1) = 0
。
为了避免这个问题,你需要避免依赖 sympy 对未定义函数的假设。
以下是一些可供选择的方法:
-
将
f(0)
替换为符号: 这将阻止 sympy 对其值做出任何假设。```python from sympy import *
x, y = symbols("x y") f = Function("f") f0 = symbols("f0") # 引入一个符号来表示 f(0) print(Eq(f(1), x * f0).simplify(rational=True, doit=False)) ```
这将输出预期的结果:
Eq(f(1), f0*x)
。 -
避免使用
.simplify()
: 如果你不需要进行其他简化,则可以完全省略此步骤。
虽然 sympy 对此类情况的处理方式有限制,但你可以通过理解其假设并使用适当的解决方法来获得所需的结果。
标签:python,sympy,simplify From: 78779780