Неудобная замена в Sympy

Есть ли более простой способ сделать замену в Sympy, который похож на Sage или Mathematica. В Mathematica у вас есть нечто, называемое remove(), которое с учетом набора уравнений вы можете попросить исключить определенные переменные. В Sage вам нужно быть более практичным, но он все еще более или менее похож на Mathematica. В Sympy сравнительно неудобно делать замену.

На скриншоте красными стрелками показано, о чем я говорю. Белая стрелка - это метод, который, как мне кажется, будет более подходящим.

http://i.stack.imgur.com/FQHzd.jpg

редактировать 1: вот ссылка на функцию в математике http://reference.wolfram.com/mathematica/ref/Eliminate.html


person sourcevault    schedule 29.12.2013    source источник
comment
Если вы используете функцию latex в SymPy, то большинство действий, которые вы делаете, будут выполнены за вас.   -  person asmeurer    schedule 30.12.2013
comment
Боюсь, я не понимаю, о чем вы спрашиваете. Можете ли вы показать тот же пример для SymPy и Sage или Mathematica?   -  person asmeurer    schedule 30.12.2013
comment
Конечно, допустим, у вас есть два уравнения. eq1 = x == y eq2 = x == 5 если вы хотите заменить eq2 на eq1 на sage, вы просто сделаете ans = eq1.sub(eq2). В Sympy это не так просто. По сути, у вас не может быть таких выражений, как: eq1 = x == y, вы просто делаете x = y или eq1 = x - y. это не помогает, когда вы хотите передать eq2 = x - 5 в качестве замены, так как sympy не знает, что вы хотите избавиться от x, скорее вам нужно передать {x:5}, что хорошо для небольших уравнений, но если у вас много переменных, это становится утомительно по сравнению на путь мудреца/математики   -  person sourcevault    schedule 30.12.2013
comment
Есть несколько способов сделать это, но я не уверен, какой из них самый чистый. Я открыл github.com/sympy/sympy/issues/2720 для eliminate().   -  person asmeurer    schedule 01.01.2014
comment
эй спасибо! Я думаю, что кто-то уже говорил об этом где-то в гугл-тредах/списке рассылки.   -  person sourcevault    schedule 04.01.2014


Ответы (2)


У вас могут быть уравнения (фактически объект равенства) в SymPy:

>>> eq1=Eq(x,y);eq2=Eq(x,5)

Но вы правы, сабы не угадывают все за вас. Похоже, Сейдж предполагает, что если переменная изолирована в одной части уравнения, то именно эту переменную нужно заменить. Но нет никакой гарантии, что у вас всегда будет удобная изолированная переменная. Нетрудно использовать решение, чтобы дать вам желаемую изолированную переменную:

>>> solve(eq2,x,dict=1)
[{x:5}]

И затем это можно подставить в уравнение, из которого вы хотите исключить эту переменную.

>>> eq1.subs(solve(eq2,x,dict=1)[0])
5=y

Использование ключевого слова «исключить» в настоящее время ведет себя не совсем так, как я ожидал; возможно, он должен действовать в смысле исключения:

>>> solve((eq1,eq2), exclude=(x,))
{y:x}
person smichr    schedule 01.01.2014
comment
Насколько я помню, в какой-то момент обсуждалась возможность использования Eq с сабвуферами, но она была отвергнута. - person asmeurer; 04.01.2014
comment
здесь есть первый набросок функции, которая делает это более автоматизированным. (Ищите URL-адрес этой страницы на этой странице.) - person smichr; 01.07.2017

Следуя приведенным выше комментариям и https://github.com/sympy/sympy/issues/14741 один из способов сделать это в Sympy:

from sympy import Eq, var
var('P, F, K, M, E0, E1, E2, E3, E4')
a = Eq(E1, (E0 + P - F)*K - M)
b = Eq(E2, (E1 + P - F)*K - M)
c = Eq(E3, (E2 + P - F)*K - M)
d = Eq(E4, (E3 + P - F)*K - M - F)
d.subs(*c.args).subs(*b.args).subs(*a.args)
person Stan Schymanski    schedule 30.05.2018