【问题标题】:Sympy evalf doesn't work with 1 variable subs() in 2 variable expressionSympy evalf 不适用于 2 个变量表达式中的 1 个变量 subs()
【发布时间】:2018-10-11 03:23:26
【问题描述】:

对于使用 Sympy 在 python 中的大学项目,我需要在部分替换后评估 2 var 符号函数的输出,例如:

f = (x-1)/sqrt((x-10)^2+(y-10)^2) / x = 1 => f = 0

如果我使用 1 var func,它可以正常工作:

>>> from sympy import *
>>> x = symbols('x')
>>> F = 1-x
>>> F.evalf(subs={x: 1})
0.e-125

但在 2 var 函数的情况下,subs 似乎没有正确地进行替换:

>>> from sympy import *
>>> x,y = symbols('x y')
>>> F = (x-1)/sqrt((x-10)**2+(y-10)**2)
>>> F.evalf(subs={x: 1})
(x - 1.0)*((x - 10.0)**2 + (y - 10.0)**2)**(-0.5)

我预计 F = 0,因为 x = 1

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    我不是同情专家,但我发现了一个反例,y 的值使表达式非零:

    >>> F.evalf(subs={x:1,y:float("nan")})
    nan
    

    ynan 时,结果不为零。因此,在不知道 y 的值的情况下,无法简化表达式(注意:即使结果也应该是 nan,sympy 也会愉快地将 F.evalf(subs={x:1,y:oo}) 评估为 0)

    【讨论】:

    • 你说得对,我没有想到这一点,但我发现如果我只是: >>> F.subs(x,1) 0 现在如果我明确替换 y = nan 只有那么我得到nan 答案 >>> F.subs(y,nan) nan
    • 我想你可以自己写下这个问题的答案。
    【解决方案2】:

    如上所述,如果 y = nan 会创建一个数学异常,因此永远不会发生替换。 但我发现如果我只使用潜艇,那么我会得到我想要的:

    >>> F.subs(x,1)
    0
    

    现在,如果我明确替换 y = nan,那么我会得到 nan 答案

    >>> F.subs(y,nan)
    nan
    

    我猜 evalf 只是在评估替换之前检查更多异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多