【问题标题】:Sympy: solve for fractionSympy:求解分数
【发布时间】:2019-08-13 01:06:30
【问题描述】:

我有一个方程,我需要求解它的一个分数。 我有更复杂的公式要解决,但这里有一个小例子:采用以下简单函数Y = X*a。 我想解决Y/X,所以我期待Y/X =a。 这是代码,它产生一组空答案

from sympy import *
X,Y,a = symbols('X Y a')
testEq = Eq(Y,X*a)
solve(testEq,Y/X)

我想我误解了什么,任何帮助表示赞赏!

【问题讨论】:

  • 解决Y 并将答案除以X 怎么样?
  • 绝对有可能,也许有点乱。但仍然很奇怪,它不能按照建议的方式工作,不是吗?
  • Sympy 旨在解决变量而不是表达式。您的期望超出了软件包的功能。

标签: python sympy


【解决方案1】:

solve 函数可以求解子表达式,前提是它们“按原样”出现在正在求解的方程中。例如,在下面的代码中,solvetestEq 返回一个空解,但它为testEq2 返回正确的解,这是用Y/X 重新排列的相同方程。

from sympy import *
X,Y,a = symbols('X Y a')
testEq = Eq(Y,X*a)
solve(testEq,Y/X)
testEq2 = Eq( Y/X, a )
sol = solve(testEq2,Y/X)

这一点也不奇怪或不合理。如果您查看 solve 函数的源代码,它使用的代码类似于

>>> testEq.has( Y/X ) # returns False
>>> testEq2.has( Y/X ) # returns True

检查我们正在求解的符号(或 sympy 对象)是否存在于方程中。如果 SymPy 必须检查表达式的符号可以组合成子表达式的所有可能方式,那么对于可以通过其他方式轻松实现的代码(例如求解 Y 并除以X,在这个例子中)。

符号计算包可以帮助我们处理复杂的数学方程。但它们不能替代人类智能。通常情况下,我们需要指导这些软件包,以帮助它们以我们想要的形式给出答案,同时解决它们的局限性。

【讨论】:

    【解决方案2】:

    在此issue 中,一旦将辅助表达式添加到感兴趣的表达式,focus 例程就会处理此类请求:

    >>> eq = Eq(y, x*a)
    >>> aux = Eq(b, y/x)
    >>> focus((aux, eq), b)
    {b: a}
    

    这样的例程并没有消除人工干预的需要,它只是通过允许用户陈述感兴趣的关系并将其添加到当前方程中来提供帮助,然后从中推断/解决其含义。

    【讨论】:

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