2014-03-07 3 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(), чтобы просто дать мне ответ)? Любые указатели на манипуляции, которые действительно возможны с симпатичными равенствами, будут оценены.

+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 
Смежные вопросы