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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

2319閲覧

[python3]sympyを使った積分でif文を使いたい

yoko28

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/07/30 02:24

pythonは初級者です。
下記の現象の対処方法がわかりません。
教えていただけますでしょうか。

前提・実現したいこと

  • pythonにてSympyを使って積分をしたいです。
  • 積分をする式にif文を入れたいです。

発生している問題・エラーメッセージ

File "/usr/local/lib/python3.6/dist-packages/sympy/core/relational.py", line 384, in __nonzero__ raise TypeError("cannot determine truth value of Relational") TypeError: cannot determine truth value of Relational

該当のソースコード

Python

1import sympy 2 3def func(r): 4 if r > 0.5: # <-ここで上記のエラーが出る 5 result = sympy.sin(r) / (sympy.pi*r) * sympy.cos(r) 6 else: 7 result = sympy.sin(r) / (sympy.pi*r) * sympy.sin(r) 8 return result 9 10if __name__ == '__main__': 11 r = sympy.Symbol('r') 12 result = sympy.integrate(func(r) , (r,-sympy.oo,sympy.oo)) 13

試したこと

調べてたら、Piecewiseという関数があるので、使ってみましたが、エラーが出ました。

補足情報(FW/ツールのバージョンなど)

OS:Windows10 WSL1 Ubuntu18.04
python version:3.6.9

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

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

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

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

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

tetsunosuke

2020/07/30 03:23

やりたいことがよくわかりませんでした。 ここでいうfuncは「積分される対象の式を作る」という内容が記載されるべきです。 例えば f(x) = x + 1 という数式があったとしたら、その"x+1"という文字列を返す、に近いです。 (なので、rはsympy.Symbol('r')を渡しています) やりたいことは f(x) = sin(x)/(πx * cos(x)) という数式を、 xが 0.5以上の部分とそうでない部分で定積分して、それらの結果を加算したい、とかそういったことをやりたいのでしょうか?
tetsunosuke

2020/07/30 03:27

もし上記の仮定であれば (こちらの欄はインデントがずれるのでご容赦ください) 下記のような感じになると思います。 import sympy def func(r): result = sympy.sin(r) / (sympy.pi*r) * sympy.cos(r) return result if __name__ == '__main__': r = sympy.Symbol('r') result = sympy.integrate(func(r) , (r,-sympy.oo, 0.5)) result += sympy.integrate(func(r) , (r,0.5, sympy.oo)) print(result)
yoko28

2020/07/30 04:29

説明が不明慮で申し訳ないです。 > f(x) = sin(x)/(πx * cos(x)) という数式を、 xが 0.5以上の部分とそうでない部分で定積分して、それらの結果を加算したい、とかそういったことをやりたいのでしょうか? ほぼあってます。 sin(x)/πx に対して x >0.5 の時に cos(x)を掛けて積分をした結果 x <0.5の時に sin(x)を掛けて積分をした結果 を足し合わせたいのです。 ご指摘いただいた方法で出来そうです。 import sympy def func(r): result = sympy.sin(r) / (sympy.pi*r) * sympy.sin(r) return result def func2(r): result = sympy.sin(r) / (sympy.pi*r) * sympy.cos(r) return result if __name__ == '__main__': r = sympy.Symbol('r') result = sympy.integrate(func(r) , (r,-sympy.oo, 0.5)) result += sympy.integrate(func2(r) , (r,0.5, sympy.oo)) print(result)
yoko28

2020/07/30 04:30

また、if文でなくても2つの積分に分ければよいというのは理解できたのですが、 下記のように、積分したい関数の中に複数の分岐がある場合どうしたらいいのでしょうか。 (領域を4パターンに区分けして積分し最後に加算する?) Aは定数(1回の積分中には可変させないが、積分をする前に可変させる場合がある) def func(x): <-この関数を積分したい r1 =func1(x) r2 =func2(r1) r3 =func3(r2) return r3 def func1(x): if data <= 0.5: res1 = x **2 else: res1 = exp( x) return res1 def func2(x): res1 = x * A return res1 def func3(x): if x >= 0.1: res1 = x ** 2 else: res1 = sqrt(x) return res1
tetsunosuke

2020/07/30 04:37

なるほど、数式がちょっとだけ変わっているのに気づきませんでした。 > 積分したい関数の中に複数の分岐がある なるほど。 やはりこれは(通常の数学の積分と同じように) その変化点までの定積分の値と、そこから先というように分けたものを加算するしかないのではないでしょうか。 > (領域を4パターンに区分けして積分し最後に加算する?) という意味合いになると思います。
guest

回答1

0

ベストアンサー

Piecewiseを用いて積分できます。

python

1import sympy as sp 2 3r = sp.Symbol('r', real=True) 4f = sp.Piecewise((sp.sin(r) / (sp.pi * r) * sp.cos(r), r >= 0.5), 5 (sp.sin(r) / (sp.pi * r) * sp.sin(r), r < 0.5)) 6sp.integrate(f, (r, -sp.oo, sp.oo)) 7```![結果](4eb18a451db9c74a05be367fd7ab2814.png)

投稿2020/07/30 07:42

Penpen7

総合スコア698

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

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

yoko28

2020/07/31 00:37

回答ありがとうございます。 教えていただいた方法で解決できました。 質問への追記・修正の方でも回答をいただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問