2017-11-29 33 views
2

私は熱力学ラボの結果を処理するためにPython(3)を使用しようとしています。そのうちの1つは、最適フィットカーブを見つけ、必要な指数を推測することです。私はそれを解決するためにSymPyを使用しています。SymPy解法の解を関数に変換するときの問題

私は立ち往生しています。 SymPyは方程式をうまく解くことができますが、解決策を利用可能な形にすることは私を困惑させています。 SymPyからシンボリック以外のものに戻す方法はありますか?これは私が今まで試したことです:

def Solve_Tao(Td,TC,t): 
"""Solves for Decay Constant and Returns Average For Data""" 
T = t # Time, Storing so it doesn't become symbolic 
Tao, t, Tinf, Tsi, Ts_t = sp.symbols('Tao t Tinf Tsi Ts_t') 
sp.init_printing(use_unicode=False) 
TaoStrings = sp.solve([(Tinf + (Tsi - Tinf) * sp.exp(-t/Tao))-Ts_t], [Tao]) 
TaoStrings = sp.sstrrepr(TaoStrings) 
TaoS = TaoStrings[6:9] + 'np.'+ TaoStrings[9:-1] 
eq = parse(TaoS) 

Tinf = Td 
Ts_t = TC 
Tsi = TC[0] 
t = T 
tao = eq 
print('tao',tao) 
return tao 

しかし、印刷されたタオの値は0であることが判明しました。タイプ(eq)は、tao '< _ast.Moduleオブジェクト0x10773b3c8>'になります。私はこれで何かできますか?そうでない場合は、SymPyの解決済みの式を使用する方法はありますか?

あなたのお手伝いがありがとうございます。

答えて

2

解決策をそのまま評価する方が簡単かもしれません。例えば、t=0で解を評価するには、メソッドを使用します。あなたはすべての4つの変数のためのソリューションを評価する必要がある場合は

>>> soln = sp.solve([(Tinf + (Tsi - Tinf) * sp.exp(-t/Tao))-Ts_t], [Tao])[Tao] 
>>> soln 
-t/log((Tinf - Ts_t)/(Tinf - Tsi)) 
>>> soln.subs(t,0) 
0 

単にsubを繰り返します。

soln.subs(t,0).subs(Tinf,<something>).subs(Ts_t,<something>).subs(Tsi,<something>) 

あなたは辞書dにすべての4つの変数の値を持って起こる場合は、このフォームを使用することができます

soln.subs(d) 
+0

感謝を。私はあなたが辞書と.Subs()の繰り返しを提案したことを試しました。最初に「Dict」にはアトリビュート「Subs」がありません.2番目のものを試してみると AttributeError: 'Mul'オブジェクトには「Subs」属性がありません –

+1

大文字の「Subs」は使用しないことをお勧めします。そうでない場合は、コード全体を表示してください。 –

+0

私はしました!問題は解決し、それは素晴らしい作品です。ありがとうございました! –

関連する問題