質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1355閲覧

Python Sympyライブラリのreplace()が使えない

asiangeorge

総合スコア8

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/10/07 09:22

編集2020/10/07 13:56

前提・実現したいこと

回路の電流・電圧(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_Lvl_slvdi_Cic_slvdの型を調べたところ、
v_Li_Csympy.core.function.UndefinedFunction
vl_slvdic_slvdsympy.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
です。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/10/07 13:03

まずは、ソースコードだけを実行して、エラーが再現できるようにお願いします。 importからちゃんと書いて欲しいですし、たくさんある未定義の変数の定義も書いてください。 ソースだけ読んでズバリ回答を示せることは稀で、回答者の環境でエラーを再現させて解決策を検討するからです。
asiangeorge

2020/10/07 13:30

コメントありがとうございます。 importは ``` from sympy import core, var, Function, Eq, diff, sympify from sympy.solvers import solve from sympy.interactive import init_printing from sympy.abc import a, b, t ``` です。 変数は全て上記のコード内で宣言・定義してあります。
toast-uz

2020/10/07 13:33

ここは、「質問への追記・修正の依頼」ですので、質問文を修正お願いします。
asiangeorge

2020/10/07 13:37

失礼致しました。同時に質問文の修正も行いましたのでご覧いただければ幸いです。
toast-uz

2020/10/07 13:40

ありがとうございます。実行できました。 コード中の、#<- ここでエラー はどういう意味でしょうか?そこではエラーは出ていません。気にしなくてよいのでしょうか?わかりにくいので修正されることをオススメします。
asiangeorge

2020/10/07 13:47

ありがとうございます。 私が実行すると、まさにその「#<- ここでエラー」の行でエラーが出ます… その下の「#<- ここでも同様のエラー」の行は上のエラーが出る行をコメントアウトしてこの行までプログラムがたどり着くようにした結果、ここでも同じエラーが出たのでこのようにコメントを書いてあります。 この旨追記して質問文を修正します。
toast-uz

2020/10/07 13:52

おかしいです。subsの行ではエラーが発生しません。 sympyに詳しくありませんが、subsは「代入」、replaceは「置き換え」です。そのため、replaceではご理解の通りに同じ型である必要があります。しかし,その直前コメントを見ると、そもそもやりたいことは「代入」ですよね。なぜreplaceを使うのでしょうか?
toast-uz

2020/10/07 13:59

両方の行をreplaceに修正されましたね。なせ「代入」なのにreplaceをするのでしょうか?
asiangeorge

2020/10/07 13:59

大変失礼致しました。試行錯誤している時にsubsを試したのをそのままにしていました。 subsは変数の代入、replaceは関数の置き換えと認識していたので、ここでは関数なのでreplaceにしています。また、subsの場合エラーは出ませんがこの後にsubsの代入が反映されていないようだったのもあってreplaceを選びました。 お手数を掛けて申し訳ありません。
toast-uz

2020/10/07 14:04

式変形のねらいがわかっていませんが、 eq_ind = eq_ind.replace(v_L(t), vl_slvd) としてはいかがでしょうか?ちなみにreplaceをsubsに変えても結果は同じです。この表記ならsubsの前後で変形されます。
asiangeorge

2020/10/07 14:07

おっしゃる通り、「v_L」を「v_L(t)」にするとエラーは解消し、またreplaceでもsubsでもその後のプログラムに反映されるようになりました。 ありがとうございます!!大変助かりました。
toast-uz

2020/10/07 14:09

よかったです。それでは回答記載しますので、クローズしてください。
guest

回答1

0

ベストアンサー

以下のように修正してください。

Python

1eq_ind = eq_ind.replace(v_L(t), vl_slvd) 2eq_cap = eq_cap.replace(i_C(t), ic_slvd)

replaceは、関数を関数に置き換える操作です。
vl_slvd = v_s - v_C(t)という形式を置き換えるため、v_Lという関数名だけでなくv_L(t)という形式にする必要があるようです。2つ目も同様です。

投稿2020/10/07 14:12

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問