Sympy:手动处理等式

Sympy: working with equalities manually

提问人:Marius 提问时间:3/7/2014 更新时间:5/19/2020 访问量:2368

问:

我目前正在学习一门数学课程,我的目标是理解概念和过程,而不是尽快处理问题集。在解方程时,我希望能够自己戳它们,而不是让我解它们。

假设我们有一个非常简单的方程 - 如果我自己解决这个问题,我显然会从两边减去 1,但我无法弄清楚是否提供了一个简单的方法来做到这一点。目前,我能想到的最佳解决方案是:z + 1 = 4sympy

from sympy import *
z = symbols('z')
eq1 = Eq(z + 1, 4)
Eq(eq1.lhs - 1, eq1.rhs - 1)
# Output:
# z == 3

其中更明显的表达式仅从左侧减去。我如何使用 sympy 像这样一步一步地解决等式(即,没有得到只是给我答案的方法)?任何指向同情等式实际可能的操纵的指针将不胜感激。eq1 - 1solve()

python sympy

评论

0赞 Omegaman 10/7/2015
我问了开发人员同样的问题,因为我发现现有的方法不直观。不过,Mathematica 的行为方式是一样的。
0赞 mins 9/16/2022
"如果你能说 eq_2 = eq * denom 不是很好吗?答案是......自定义 Python 的 sympy 以便于方程操作

答:

11赞 smichr 11/16/2014 #1

https://github.com/sympy/sympy/issues/5031#issuecomment-36996878 有一种“做”方法和讨论,可以让你对平等的双方“做”操作。它尚未被接受为 SymPy 的补充,但它是您可以使用的简单附加组件。为方便起见,将其粘贴在此处:

def do(self, e, i=None, doit=False):
    """Return a new Eq using function given or a model
    model expression in which a variable represents each
    side of the expression.

    Examples
    ========

    >>> from sympy import Eq
    >>> from sympy.abc import i, x, y, z
    >>> eq = Eq(x, y)

    When the argument passed is an expression with one
    free symbol that symbol is used to indicate a "side"
    in the Eq and an Eq will be returned with the sides
    from self replaced in that expression. For example, to
    add 2 to both sides:

    >>> eq.do(i + 2)
    Eq(x + 2, y + 2)

    To add x to both sides:

    >>> eq.do(i + x)
    Eq(2*x, x + y)

    In the preceding it was actually ambiguous whether x or i
    was to be added but the rule is that any symbol that are
    already in the expression are not to be interpreted as the
    dummy variable. If we try to add z to each side, however, an 
    error is raised because now it is unclear whether i or z is being
    added:

    >>> eq.do(i + z)
    Traceback (most recent call last):
    ...
    ValueError: not sure what symbol is being used to represent a side

    The ambiguity must be resolved by indicating with another parameter 
    which is the dummy variable representing a side:

    >>> eq.do(i + z, i)
    Eq(x + z, y + z)

    Alternatively, if only one Dummy symbol appears in the expression then
    it will be automatically used to represent a side of the Eq.

    >>> eq.do(2*Dummy() + z)
    Eq(2*x + z, 2*y + z)

    Operations like differentiation must be passed as a
    lambda:

    >>> Eq(x, y).do(lambda i: i.diff(x))
    Eq(1, 0)

    Because doit=False by default, the result is not evaluated. to
    evaluate it, either use the doit method or pass doit=True.

    >>> _.doit == Eq(x, y).do(lambda i: i.diff(x), doit=True)
    True
    """
    if not isinstance(e, (FunctionClass, Lambda, type(lambda:1))):
      e = S(e)
      imaybe = e.free_symbols - self.free_symbols
      if not imaybe:
          raise ValueError('expecting a symbol')
      if imaybe and i and i not in imaybe:
          raise ValueError('indicated i not in given expression')
      if len(imaybe) != 1 and not i:
          d = [i for i in imaybe if isinstance(i, Dummy)]
          if len(d) != 1:
              raise ValueError(
                  'not sure what symbol is being used to represent a side')
          i = set(d)
      else:
          i = imaybe
      i = i.pop()
      f = lambda side: e.subs(i, side)
    else:
      f = e
    return self.func(*[f(side) for side in self.args], evaluate=doit)

from sympy.core.relational import Equality
Equality.do = do

评论

0赞 mins 9/16/2022
不幸的是,6 年后还没有合并
0赞 smichr 9/20/2022
另请参阅 awstip.com/...