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
やりたいことがよくわかりませんでした。
ここでいうfuncは「積分される対象の式を作る」という内容が記載されるべきです。
例えば f(x) = x + 1 という数式があったとしたら、その"x+1"という文字列を返す、に近いです。
(なので、rはsympy.Symbol('r')を渡しています)
やりたいことは
f(x) = sin(x)/(πx * cos(x)) という数式を、 xが 0.5以上の部分とそうでない部分で定積分して、それらの結果を加算したい、とかそういったことをやりたいのでしょうか?
もし上記の仮定であれば
(こちらの欄はインデントがずれるのでご容赦ください)
下記のような感じになると思います。
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)
説明が不明慮で申し訳ないです。
> 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)
また、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
なるほど、数式がちょっとだけ変わっているのに気づきませんでした。
> 積分したい関数の中に複数の分岐がある
なるほど。
やはりこれは(通常の数学の積分と同じように)
その変化点までの定積分の値と、そこから先というように分けたものを加算するしかないのではないでしょうか。
> (領域を4パターンに区分けして積分し最後に加算する?)
という意味合いになると思います。
回答1件
あなたの回答
tips
プレビュー