私の問題のために、scipyではなくモジュールのガンマ関数を使用する必要があります。ただし、変数が配列から取得され、y値が同じ形式で生成されることになっている場合、関数をプロットするために使用しています。しかし、そうすると、配列からmpfへの変換について不平を言うエラーメッセージが表示されます。mpmath
matplotlib.pyplot
numpy
TypeError
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import quad, dblquad
import mpmath as mp
low, up = 5.630e5, 1.167e12
alpha, threshold = 1.05 , 2.15e10
beta = 274
def g(x, low, up, beta):
return mp.gamma(-2/3) * (mp.gammainc(-2/3, beta*(x/low)**3) - mp.gammainc(-2/3, beta*(x/up)**3))
def Integrand1(x, low, up, threshold, alpha, beta):
return pow(x/threshold, alpha) * g(x, low, up, beta)
def Integrand2(x, low, up, threshold, alpha, beta):
return g(x, low, up, beta)
def PDF(x, low, up, threshold, alpha, beta):
A = quad(Integrand1, low, threshold, args=(low, up, threshold, alpha, beta))
B = quad(Integrand2, threshold, up, args=(low, up, threshold, alpha, beta))
C=(A[0]+B[0])**(-1)
y = np.piecewise(x,
[x < threshold], [lambda x: C * pow(x/threshold, alpha) * g(x, low, up, beta),
lambda x: C * g(x, low, up, beta)
]
)
return y
x_array = np.array(np.logspace(8.2, 11.8, 10))
y_array = PDF(x_array, low, up, threshold, alpha, beta)
plt.plot(x_array, y_array, color='green', linestyle='-')
plt.gca().autoscale(False)
plt.vlines([threshold],
plt.gca().get_ylim()[0], plt.gca().get_ylim()[1],
linestyles='dashed', color='k', label='')
plt.xscale("log", nonposx='clip')
plt.yscale("log", nonposy='clip')
plt.show()
トレースバック (最新の呼び出しが最後): ファイル "test.py"、35 行目、y_array = PDF(x_array、low、up、threshold、alpha、beta) ファイル "test.py"、28 行目、PDF ラムダ x: C * g(x, low, up, beta) ファイル "/home/username/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py"、1344 行目、区分 y[condlist[k ]] = item(vals, *args, **kw) ファイル "test.py"、27 行目、[x < しきい値]、[ラムダ x: C * pow(x/threshold, alpha) * g(x, low, up, beta), File "test.py", line 13, in g return mp.gamma(-2/3) * (mp.gammainc(-2/3, beta*(x/low)**3) ) - mp.gammainc(-2/3, beta*(x/up)**3)) ファイル "/home/username/anaconda3/lib/python3.6/site-packages/mpmath/functions/expintegrals.py" 、141行目、gammainc a = ctx.convert(a) ファイル "/home/username/anaconda3/lib/python3.6/site-packages/mpmath/ctx_mp_python.py"、662 行目、convert return ctx._convert_fallback(x, strings) ファイル "/home/username /anaconda3/lib/python3.6/site-packages/mpmath/ctx_mp.py"、614 行目、_convert_fallback で TypeError("cannot create mpf from " + repr(x)) TypeError: cannot create mpf from array([ 6.11259157 e+09、9.68780477e+10、9.68780477e+10、9.68780477e+10、
1.53541358e+12、2.43346654e+13、3.85678455e+14、6.11259157e+15])
配列を mpf する方法を知る必要があり、 (配列を mpf する方法) と ( mpf を作成する) のページを見つけましたが、それらをプロット ルーチンに適用する方法がわかりません。