2017-01-16 6 views
4

EDIT: Ich frage nicht, wie man eine Gleichung in Bezug auf eine gegebene Variable löst (wie in diesem supposed duplicated question), aber wie man einen Ausdruck in Form von darstellt anderer, wie in der Frage angegeben. Ich glaube, es ist die "doppelte" Frage, einen irreführenden Titel zu haben.Wie man einen Ausdruck in Bezug auf einen anderen Ausdruck in sympy umwandelt

Ich bin sehr neu mit SymPy. Ich habe einen Ausdruck, der, einmal in Bezug auf einen anderen Ausdruck ausgedrückt, sehr nett werden sollte. Das Problem ist, dass ich nicht weiß, wie man den ursprünglichen Ausdruck in Bezug auf den anderen "zwingen" kann.

Dies ist ein einfaches Beispiel:

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 und B eher komplexer Ausdrücke sein könnten. Als Referenz ist dies mein wirkliches-Case-Szenario:

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

Sobald ich St in Bezug auf V schreiben, sollte ich in der Lage sein, zu vereinfachen, nur um

St = rS (t) + rV

Aber ich kann es nicht in SymPy tun.

Antwort

2

Zunächst ist zu beachten, dass, wenn Sie so etwas wie

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

Variablen tun A, B sind nicht neue Sympy Symbole, die Sympy verstehen und arbeiten auf, sondern sie sind Aliase für die Sympy Ausdrücke a+b+c und a+c , beziehungsweise. Daher ist A.subs(a+c,B) im Wesentlichen dasselbe wie A.subs(a+c,a+c), was natürlich bedeutungslos ist. Sie bekommen die Idee, warum A.rewrite(B) auch nichts bringt.

Ich glaube nicht, dass Anrufe wie expr.subs({complicated_mutlivariable_formula: new_variable}) in Sympy arbeiten. Eine Möglichkeit, das zu tun, was Sie wollen, besteht darin, zuerst die Gleichung complicated_mutlivariable_formula = new_variable in Bezug auf eine der "alten" Variablen zu lösen, und unter der Annahme, dass eine eindeutige Lösung existiert, verwenden Sie subs(), um diese Variable zu ersetzen.

Anwendung dieses Ansatzes für das zweite Beispiel:

# 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

Verwandte Themen