如何根据sympy中的其他表达式重写表达式

时间:2017-01-16 14:26:45

标签: sympy polynomials

编辑:我不是问如何根据给定变量解决方程式(如此supposed duplicated question),而是如何根据问题中指定的另一个表达式表达式。 我认为这是一个具有误导性标题的“重复”问题。

我是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 equation

A.rewrite(B)

error message

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 equation

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

St equation

一旦我用V语写St,我应该能够简化以获得

St = rS(t)+ rV

但是我无法在SymPy中做到这一点。

1 个答案:

答案 0 :(得分:6)

首先请注意,当您执行类似

的操作时
a,b,c =  sp.symbols('a b c')
A = a+b+c
B = a+c

变量AB 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()

enter image description here