前提・実現したいこと
回路の電流・電圧(v_L
, v_C
, i_L
, i_C
)を、PythonのSympyライブラリを使い方程式を解いて計算したい。
発生している問題
VS Codeで実行しているJupyter Notebookで、方程式にほかの式を代入するためにreplace()
を使ったところエラーが発生しました。
該当のソースコード
Python
1from sympy import core, var, Function, Eq, diff, sympify 2from sympy.solvers import solve 3from sympy.interactive import init_printing 4from sympy.abc import a, b, t
(コメントを受けて上記importを追記しました)
Python
1var('v_L, v_C, i_L, i_C', cls=Function), var('v_s, L, C, Z') # 未知数, 既知数 2 3eq_ind = Eq(v_L(t), L * diff(i_L(t), t)) 4eq_cap = Eq(diff(v_C(t), t), i_C(t) / C) 5eq_ohm = Eq(v_C(t), (i_L(t) + i_C(t)) * Z) 6eq_kvl = Eq(v_s, v_L(t) + v_C(t)) 7 8# 上の式のうち2つを変形 9var('vl_slvd, ic_slvd', cls=Function) 10vl_slvd = solve(eq_kvl, v_L(t))[0] 11ic_slvd = solve(eq_ohm, i_C(t))[0] 12 13# 変形した式を残りの2式に代入 14eq_ind = eq_ind.replace(v_L, vl_slvd) #<- ここでエラー 15eq_cap = eq_cap.replace(i_C, ic_slvd) #<- ここでも同様のエラー 16
エラーメッセージ
上記コードの下から2行目、
eq_ind = eq_ind.subs(v_L, vl_slvd) #<- ここでエラー
の行で下記のエラーが発生しました。その下の
eq_cap = eq_cap.replace(i_C, ic_slvd) #<- ここでも同様のエラー
については、上の行をコメントアウトしてこの行まで実行されるようにした結果、ここでも同じ下記のエラーが出ました。
~/.pyenv/versions/3.8.2/lib/python3.8/site-packages/sympy/core/basic.py in replace(self, query, value, map, simultaneous, exact) 1444 _value = lambda expr, result: value(*expr.args) 1445 else: -> 1446 raise TypeError( 1447 "given a type, replace() expects another " 1448 "type or a callable") TypeError: given a type, replace() expects another type or a callable
試したこと
エラー直前の行でv_L
、vl_slvd
、i_C
、ic_slvd
の型を調べたところ、
v_L
とi_C
はsympy.core.function.UndefinedFunction
vl_slvd
とic_slvd
はsympy.core.add.Add
だったのでこの型の相違が原因ではないかと思っていますが、型を変えるやり方がわかりません。
補足情報(FW/ツールのバージョンなど)
環境は
Python 3.8.2を実行しているJupyter Notebook
Visual Studio Code 1.49.3 + MicrosoftのPython拡張機能 v2020.9.114305
Sympy 1.6.2
macOS 10.15.7
です。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー