2016-04-17 22 views
2

私はこのように巻き取るsympy結果持っている:私は形式であるために、この関数を知っているsympyに強制的に特定の部分式を抽出させるには?

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

表現eqVcすると、このように出てきます

私の目標は、Vの値を取得することですcinit、Vcfinal、およびtauがありますが、特にtauです。

Sympyにこれらの値を抽出させる方法はありますか? cse()は、私が望むことを全くしません。例えば、cse([C1 + Cs、eqVc])を使ってC1 + Csを置き換えることができます。部分式にtを含める傾向があります。

答えて

3

簡単な方法は、式が時間内のポイントの数に等しくなるようになりますパラメータについて解くことです。フォームは実際には同じであることを考えると、これは正常に動作します:私は取得

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) 

答えはlog(exp())があるため、変数が定義されている方法で離れて簡素化されていないことを

[{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}] 

です。 (V_Ci, tau, V_Cf = symbols('V_Ci, tau, V_Cf', real=True)とあなたのコードで同様の変更)本物のようにすべてを定義することは、私が期待していたが、それは仕事を取得しより

[{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

異なるルートにsoluionを簡素化します! 3つの未知数を解くために少なくとも3つある必要がある場合を除き、平等を設定している時間は比較的恣意的であり、なんらかの理由でt = 0を含める必要があることを指摘する価値があります。何らかの理由で、[1,2,3]で解決できません(または少なくとも私が待っているよりも時間がかかります)。 – Omegaman

+0

私は、最初の電圧を計算するために、少なくとも1つの時間がヘビサイドのゼロ側にある必要があると思います。 – chthonicdaemon

関連する問題