如何在绘制mpmath模块中定义的函数而不是scipy时管理“TypeError”消息?

时间:2017-11-21 04:53:46

标签: arrays numpy matplotlib typeerror mpmath

出于我的问题的目的,我必须使用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),但我不知道如何将它们应用到我的绘图程序中。

1 个答案:

答案 0 :(得分:1)

这不是关于绘图的。错误发生在函数PDF中,特别是在np.piecewise内。正如documentation所说,传递给piecewise的lambdas必须能够获取数组,因为这是piecewise传递给它们的内容。

你的函数g无法获取数组,因为它使用的mpmath函数适用于单个浮点数。解决方案:np.vectorize包装器:

gv = np.vectorize(g)

然后在gv中使用g代替piecewise

然后np.piecewise将有效,您就可以继续处理其他错误,例如名称不匹配PDF_valuesy_array