Как переписать выражение в терминах другого выражения в sympy

РЕДАКТИРОВАТЬ: я не спрашиваю, как решить уравнение с точки зрения данной переменной (как в этом предполагаемый дублированный вопрос), но как представить выражение в терминах другого, как указано в вопросе. Я считаю, что это «дублированный» вопрос с вводящим в заблуждение заголовком.

Я новичок в SymPy. У меня есть выражение, которое, будучи однажды выраженным в терминах другого выражения, должно стать очень красивым. Проблема в том, что я не знаю, как «заставить» выразить исходное выражение через другое.

Это простой пример:

import sympy as sp
sp.init_printing(use_unicode=True)
a,b,c =  sp.symbols('a b c')
A = a+b+c
B = a+c
C = A.subs(a+c,B) #  Expected/wanted: C = B+b
C

Уравнение C

A.rewrite(B)

сообщение об ошибке

A и B могут быть довольно сложными выражениями. Для справки, это мой реальный сценарий:

import sympy as sp
sp.init_printing(use_unicode=True)
t, w, r = sp.symbols('t w r')
S = sp.Function('S')(t)
V = (S-w*(1+r)**t)/(((1+r)**t)-1)
V

V-уравнение

St = -(r + 1)**t*(w - S)*sp.log(r + 1)/((r + 1)**t - 1)
St 

Уравнение St

Как только я напишу St в терминах V, я смогу упростить, чтобы получить просто

St = rS(t)+rV

Но я не могу сделать это в SymPy.


person Antonello    schedule 16.01.2017    source источник


Ответы (1)


Сначала обратите внимание, что когда вы делаете что-то вроде

a,b,c =  sp.symbols('a b c')
A = a+b+c
B = a+c

переменные A, B - это не новые символы Sympy, которые Sympy может понимать и работать с ними, а скорее являются псевдонимами для выражений Sympy a+b+c и a+c соответственно. Следовательно, A.subs(a+c,B) по сути то же самое, что A.subs(a+c,a+c), что, конечно, бессмысленно. Вы понимаете, почему A.rewrite(B) тоже бесполезен.

Не думаю, что вызовы типа expr.subs({complicated_mutlivariable_formula: new_variable}) работают в Sympy. Один из способов сделать то, что вы хотите, - сначала решить уравнение complicated_mutlivariable_formula = new_variable относительно одной из «старых» переменных и, предполагая, что существует уникальное решение, использовать subs() для замены этой переменной.

Применяя этот подход ко второму примеру:

# sympy Symbol A will be used to represent expression V
A = sp.symbols('A') 

# Solve the equation V==A with respect to w, which has a unique solution as a function of A
w_A = sp.solve(sp.Eq(V,A), w)[0] 

# Now substitute w 
St.subs({w:w_A}).simplify()

введите описание изображения здесь

person Stelios    schedule 16.01.2017