0

私の問題のために、scipyではなくモジュールのガンマ関数を使用する必要があります。ただし、変数が配列から取得され、y値が同じ形式で生成されることになっている場合、関数をプロットするために使用しています。しかし、そうすると、配列からmpfへの変換について不平を言うエラーメッセージが表示されます。mpmathmatplotlib.pyplotnumpy 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 を作成する) のページを見つけましたが、それらをプロット ルーチンに適用する方法がわかりません。

4

1 に答える 1