出于我的问题的目的,我必须使用mpmath
模块中的 gamma 函数,而不是 scipy 。但是,当我从matplotlib.pyplot
数组获取变量时,我使用numpy
绘制我的函数,并且y值应该以相同的格式生成。但在这样做时,我收到一条错误消息TypeError
抱怨从数组转换为 mpf 。
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()
Traceback(最近一次调用最后一次):文件“test.py”,第35行,in y_array = PDF(x_array,low,up,threshold,alpha,beta)文件“test.py”,第28行,PDF格式 lambda 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行,in [x <阈值],[lambda x:C * pow(x / threshold,alpha)* g(x,low,up,beta),文件“test.py”,第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行,转换 return ctx._convert_fallback(x,strings)文件“/home/username/anaconda3/lib/python3.6/site-packages/mpmath/ctx_mp.py”, 第614行,在_convert_fallback中 引发TypeError(“无法从”+ repr(x)创建mpf)TypeError:无法从数组创建mpf([6.11259157e + 09,9.68780477e + 10,
1.53541358e + 12, 2.43346654e + 13,3.85678455e + 14,111259157e + 15])
我需要知道如何mpf一个数组,我找到了这些页面(How to mpf an array)和(create an mpf),但我不知道如何将它们应用到我的绘图程序中。
答案 0 :(得分:1)
这不是关于绘图的。错误发生在函数PDF
中,特别是在np.piecewise
内。正如documentation所说,传递给piecewise
的lambdas必须能够获取数组,因为这是piecewise
传递给它们的内容。
你的函数g
无法获取数组,因为它使用的mpmath函数适用于单个浮点数。解决方案:np.vectorize
包装器:
gv = np.vectorize(g)
然后在gv
中使用g
代替piecewise
。
然后np.piecewise
将有效,您就可以继续处理其他错误,例如名称不匹配PDF_values
和y_array
。