如何使用sympy将一个表达式重写为另一个表达式的形式

11

编辑:我不是在问如何解出给定变量的方程(如此所谓的重复问题),而是如何表示一个表达式以另一个表达式为基础,就像问题中指定的那样。 我认为这个“重复”的问题有一个误导性的标题。

我对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)

错误信息

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方程

如果我用V来表示St,我应该能够简化为

St = rS(t)+rV

但我无法在SymPy中完成。

1个回答

14

首先请注意,当您执行以下操作时

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

变量AB并不是Sympy可以理解和操作的新符号,而是分别代表Sympy表达式a+b+ca+c的别名。因此,A.subs(a+c,B)本质上与A.subs(a+c,a+c)是相同的,当然是没有意义的。你明白为什么A.rewrite(B)也没有用了吧。

我觉得在Sympy中,像expr.subs({complicated_mutlivariable_formula: new_variable})这样的调用是不起作用的。实现你想要的方法之一是先解方程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()

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接