【问题标题】:How to rewrite an expression in terms of an other expression in sympy如何根据 sympy 中的其他表达式重写表达式
【发布时间】:2017-05-31 10:09:35
【问题描述】:

编辑:我不是在问如何根据给定变量求解方程(如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

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

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

一旦我用 V 来写 St,我应该能够简化为

St = rS(t)+rV

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

【问题讨论】:

    标签: sympy polynomials


    【解决方案1】:

    首先注意,当你做类似的事情时

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

    变量AB不是Sympy 可以理解和操作的新Sympy 符号,相反,它们分别是Sympy 表达式a+b+ca+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()
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多