2014-03-07 46 views
2

我目前正在做数学课程,我的目标是尽可能快地理解概念和过程,而不是通过问题集来紧缩。在解方程时,我想能够自己捅他们,而不是让他们为我解决。Sympy:手工操作平等

比方说,我们有非常简单的等式z + 1 = 4 - 如果我是这个解决我自己,我显然会从两边减去1,但我想不通,如果sympy提供了一种简单的方式来做到这一点。此刻,我能拿出最好的解决办法是:

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

其中较为明显的表达eq1 - 1只能从左边减去。我如何使用sympy像这样一步一步地工作(即没有让solve()方法给我答案)?任何指向实际上可能与sympy平等操作的指针将不胜感激。

+0

我问过开发人员的同样问题,因为我发现现有的方法不直观。尽管如此,Mathematica的行为方式也是一样的。 – Omegaman

回答

4

https://github.com/sympy/sympy/issues/5031#issuecomment-36996878有一个“做”的方法和讨论,可以让你“做”到平等的双方的操作。它不被接受为SymPy的补充,但它是一个简单的附加组件,您可以使用它。它粘贴在这里为了方便:

def do(self, e, i=None): 
    """do `e` to both sides of self using function given or 
    model expression with a variable representing each side: 
    >> eq.do(i + 2) # add 2 to both sides of Equality 
    >> eq.do(i + a, i) # add `a` to both sides; 3rd parameter identifies `i` 
    >> eq.do(lambda i: i + a) # modification given as a function 
    """ 
    if isinstance(e, (FunctionClass, Lambda, type(lambda:1))): 
     return self.applyfunc(e) 
    e = S(e) 
    i = (set([i]) if i else e.free_symbols) - self.free_symbols 
    if len(i) != 1: 
     raise ValueError('not sure what symbol is being used to represent a side') 
    i = i.pop() 
    f = lambda side: e.subs(i, side) 
    return self.func(*[f(side) for side in self.args]) 

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

Example: 

>>> var('s') 
s 
>>> Eq(x+1,0) 
x + 1 == 0 
>>> _.do(s+1) 
x + 2 == 1