gpt4 book ai didi

Python matplotlib错误: Supplied function does not return a valid float

转载 作者:行者123 更新时间:2023-12-01 05:25:10 25 4
gpt4 key购买 nike

from __future__ import division
import functools
import warnings
import numpy as np
import scipy as sp
from scipy import integrate
from numpy import exp, pi
import matplotlib.pyplot as plt

warnings.simplefilter("ignore", np.ComplexWarning)


def legendrePoly(a,n):

def integrand(t):
return ( ((a + exp(2j*pi*t))**2 - 1)/(2*exp(2j*pi*t)) )**n

return sp.integrate.quad(integrand,0,1)[0]


basisDim = 6
legendreBasis = [functools.partial(legendrePoly, n=i) for i in range(basisDim)]

integrand = [lambda x,i=i: exp(x) * legendreBasis[i](x) for i in range(basisDim)]
normalizingConst = [lambda x,i=i: legendreBasis[i](x)**2 for i in range(basisDim)]
basisCoeff = [sp.integrate.quad(integrand[i],-1,1)[0]
/sp.integrate.quad(normalizingConst[i],-1,1)[0] for i in range(basisDim)]

approxPoly = lambda x: sum(basisCoeff[i]*legendreBasis[i](x) for i in range(basisDim))


t = np.arange(-1, 1, 1e-3)
plt.plot(t,exp(t),'b')
plt.plot(t,approxPoly(t),'r')
plt.show()

我使用勒让德多项式作为指数函数多项式逼近的基础。我还使用柯西积分公式来评估它们,而不是直接从 numpy 导入它们。

一切都运行良好,包括定义 approxPoly,并且 approxPoly 返回我输入的任何输入的预期值。但由于某种原因,当我尝试绘制 approxPoly(t) 时,它返回错误:提供的函数未返回有效的 float 。

这个错误似乎表明,当我在 legendreBasis 中的函数调用 scipy.integrate.quad 时,那里出了问题,但如果是这种情况,那么 approxPoly 将无法工作,但如果您在 2000 点之间评估它-1 和 1 手动,并绘制这些点,一切正常,但这不正是 plt.plot 在尝试绘制我的函数时所做的事情吗?

回溯:

Traceback (most recent call last):
File "/private/var/folders/mb/yyp8v3_95l538z3g7jsttq540000gn/T/Cleanup At Startup/Exercise-413072597.643.py", line 34, in <module>
plt.plot(t,approxPoly(t),'r')
File "/private/var/folders/mb/yyp8v3_95l538z3g7jsttq540000gn/T/Cleanup At Startup/Exercise-413072597.643.py", line 29, in <lambda>
approxPoly = lambda x: sum(basisCoeff[i]*legendreBasis[i](x) for i in range(basisDim))
File "/private/var/folders/mb/yyp8v3_95l538z3g7jsttq540000gn/T/Cleanup At Startup/Exercise-413072597.643.py", line 29, in <genexpr>
approxPoly = lambda x: sum(basisCoeff[i]*legendreBasis[i](x) for i in range(basisDim))
File "/private/var/folders/mb/yyp8v3_95l538z3g7jsttq540000gn/T/Cleanup At Startup/Exercise-413072597.643.py", line 18, in legendrePoly
return sp.integrate.quad(integrand,0,1)[0]
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/integrate/quadpack.py", line 247, in quad
retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/integrate/quadpack.py", line 312, in _quad
return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
quadpack.error: Supplied function does not return a valid float.
logout

最佳答案

scipy.integrate.quad 不集成返回数组的函数。这意味着当您尝试调用 approxPoly(t) 时,t 会被传递,直到它最终出现在该函数中:

def legendrePoly(a,n):

def integrand(t):
return ( ((a + exp(2j*pi*t))**2 - 1)/(2*exp(2j*pi*t)) )**n

return sp.integrate.quad(integrand,0,1)[0]

integrand 返回一个数组,并且 sp.integrate.quad 被阻塞。同样的问题在您的代码中多次出现。一切似乎都是在假设标量参数的情况下编写的。

您可以通过调用 vectorize 来解决此问题在大约Poly上:

plt.plot(t,np.vectorize(approxPoly)(t),'r')

NumPy 随后将分别对 t 的每个元素调用 approxPoly

关于Python matplotlib错误: Supplied function does not return a valid float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21517014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com