2016-04-17 8 views
2

Ich habe ein sympy Ergebnis, das so windet sich:Wie man sympy forciert, um spezifische Teilausdrücke zu extrahieren?

from sympy import * 
Vin,Vc,C1,Cs,R1,Rs,t=symbols(r'V_{in},V_{C},C_1,C_S,R_1,R_S,t') 
k1=Symbol('k_1') 
eqVc=Eq(Vc(t),(Rs*(exp(t*(R1+Rs)/(R1*Rs*(C1+Cs))) - 1)*Heaviside(t) + 
        k1*(R1+Rs))*exp(-t*(R1+Rs)/(R1*Rs*(C1+Cs)))/(R1+Rs)) 

Der Ausdruck eqVc kommt wie folgt aus:

Ich weiß, dass diese Funktion der Form sein:

Mein Ziel ist es, die Werte von V zu bekommen Cinit, VcFinal und Tau, aber besonders Tau.

Gibt es eine Möglichkeit, Sympy dazu zu bringen, diese Werte zu extrahieren? cse() tut nicht ganz, was ich will-- Ich kann es bekommen, um C1 + Cs zu ersetzen, zum Beispiel mit cse ([C1 + Cs, eqVc]), und es erkennt, dass der Exponent zu e eine gemeinsame ist Teilausdruck, aber es neigt dazu, das t in den Teilausdruck aufzunehmen.

Antwort

3

Ein einfacher Weg besteht darin, Parameter zu finden, die bewirken, dass die Ausdrücke zu verschiedenen Zeitpunkten gleich sind. Da die Formen in der Tat sind die gleichen, wird dies funktionieren:

V_Ci, tau, V_Cf = symbols('V_Ci, tau, V_Cf') 

target = V_Ci*exp(-t/tau) + Heaviside(t)*V_Cf*(1 - exp(-t/tau)) 

solve([(eqVc.rhs - target).subs(t, ti) for ti in [0, 1, 2]], 
     [V_Ci, tau, V_Cf], dict=True) 

Die Antwort, die ich erhalten, ist

[{V_Cf: R_S/(R_1 + R_S), 
    tau: 1/log(exp((1/R_S + 1/R_1)/(C_1 + C_S))), 
    V_Ci: k_1}] 

Das log(exp()) weg nicht vereinfacht wegen der Art und Weise werden die Variablen definiert. Definieren alles als real (V_Ci, tau, V_Cf = symbols('V_Ci, tau, V_Cf', real=True) und ähnliche Änderung im Code) die soluion zu

vereinfacht
[{V_Ci: k_1, 
    V_Cf: R_S/(R_1 + R_S), 
    tau: R_1*R_S*(C_1 + C_S)/(R_1 + R_S)}] 
+0

anderen Weg als ich erwartet hatte, aber es wird die Arbeit erledigt! Es lohnt sich, darauf hinzuweisen, dass die Zeiten, in denen wir Gleichheit setzen, relativ willkürlich sind, außer dass es mindestens 3 von ihnen geben muss (um die 3 Unbekannten zu lösen) und aus irgendeinem Grund muss t = 0 enthalten sein. Aus irgendeinem Grund funktioniert das Lösen bei [1,2,3] nicht (oder dauert länger als ich warten möchte). – Omegaman

+0

Ich denke, mindestens ein Mal muss auf der Nullseite der Heaviside für die anfängliche Spannung berechnet werden. – chthonicdaemon

Verwandte Themen