出力が数値ではなく新しい関数である Python を使用して関数を統合したいと考えています。たとえば、次の方程式があります (Arnett 1982 から -- 超新星の分析的説明)。
def A(z,tm,tni):
y=tm/(2*tni)
tm=8.8 # diffusion parameter
tni=8.77 # efolding time of Ni56
return 2*z*np.exp((-2*z*y)+(z**2))
次に、A の積分を見つけて、結果をプロットします。まず、単純に scipy.quad を試しました。
def Arnett(t,z,tm,tni,tco,Mni,Eni,Eco):
x=t/tm
Eni=3.90e+10 # Heating from Ni56 decay
Eco=6.78e+09 # Heating from Co56 decay
tni=8.77 # efolding time of Ni56
tco=111.3 # efolding time of Co56
tm=8.8 # diffusion parameter
f=integrate.quad(A(z,tm,tni),0,x) #integral of A
h=integrate.quad(B(z,tm,tni,tco),0,x) #integral of B
g=np.exp((-(x/tm)**2))
return Mni*g*((Eni-Eco)*f+Eco*h)
ここで、B も定義済みの関数です (ここでは示されていません)。A と B はどちらも z の関数ですが、最終的な式は時間 t の関数です。(ここでコードが失敗する原因になっていると思います。)
A と B の積分はゼロから x まで実行されます。x は時間 t の関数です。このままコードを実行しようとすると、「ValueError: 複数の要素を持つ配列の真の値があいまいです。a.any() または a.all() を使用してください」というエラーが表示されます。
そのため、少し検索した後、sympy が適しているのではないかと思いました。しかし、私もこれで失敗しています。
このタスクを完了する方法を教えてください。
どうもありがとう、ザック