Python-如何将曲线拟合到包含数值计算积分的函数?

Python-如何将曲线拟合到包含数值计算积分的函数?,python,curve-fitting,numerical-methods,numerical-integration,Python,Curve Fitting,Numerical Methods,Numerical Integration,我有以下代码: import numpy as np import scipy.integrate as spi from scipy.optimize import curve_fit import matplotlib.pyplot as plt import math as mh def GUFunction(z, Omega_Lambda): integral = spi.quad(lambda zvar: AuxIntegrandum(zvar, Omega_Lambda),

我有以下代码:

import numpy as np
import scipy.integrate as spi
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import math as mh

def GUFunction(z, Omega_Lambda):
    integral = spi.quad(lambda zvar: AuxIntegrandum(zvar, Omega_Lambda), 0.0, z)[0]
    DL = (1+z) * c/H0 * integral *1000000
    return (5*(mh.log(DL,10)-1))

def AuxIntegrandum(z, Omega_Lambda):
    Omega_m = 1 - Omega_Lambda

    return 1 / mh.sqrt(Omega_m*(1+z)**3 + Omega_Lambda)

def DataFit(filename):
    print curve_fit(GUFunction, ComputeData(filename)[0], ComputeData(filename)[1])

DataFit("data.dat")
data.dat在第一列中有z值,在第二列中有GUF(z)值

执行此代码时,编译器告诉我将数组与值(+inf或-inf)进行比较是不明确的。
我想这是指积分边界,在这里看我是否想积分到无穷远。出于某种原因,它显然将数据文件中的所有z值放入积分边界。
有没有什么技巧我不知道,可以让你把曲线拟合成数值积分函数

下面是确切的错误:

Traceback (most recent call last):
  File "plot.py", line 83, in <module>
    DataFit("data.dat")
  File "plot.py", line 67, in DataFit
    print curve_fit(GUFunction, ComputeData(filename)[0], ComputeData(filename)[1])
  File "/home/joshua/anaconda2/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 736, in curve_fit
    res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
  File "/home/joshua/anaconda2/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 377, in leastsq
    shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
  File "/home/joshua/anaconda2/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 26, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
  File "/home/joshua/anaconda2/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 454, in func_wrapped
    return func(xdata, *params) - ydata
  File "plot.py", line 57, in GUFunction
    integral = spi.quad(lambda zvar: AuxIntegrandum(zvar, Omega_Lambda), 0.0, z)[0]
  File "/home/joshua/anaconda2/lib/python2.7/site-packages/scipy/integrate/quadpack.py", line 323, in quad
    points)
  File "/home/joshua/anaconda2/lib/python2.7/site-packages/scipy/integrate/quadpack.py", line 372, in _quad
    if (b != Inf and a != -Inf):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
回溯(最近一次呼叫最后一次):
文件“plot.py”,第83行,在
数据拟合(“data.dat”)
数据拟合中第67行的文件“plot.py”
打印曲线拟合(GU函数,ComputeData(文件名)[0],ComputeData(文件名)[1])
文件“/home/joshua/anaconda2/lib/python2.7/site packages/scipy/optimize/minpack.py”,第736行,曲线拟合
res=leastsq(func,p0,Dfun=jac,满输出=1,**kwargs)
文件“/home/joshua/anaconda2/lib/python2.7/site packages/scipy/optimize/minpack.py”,第377行,在leastsq中
shape,dtype=\u check\u func('leastsq','func',func,x0,args,n)
文件“/home/joshua/anaconda2/lib/python2.7/site packages/scipy/optimize/minpack.py”,第26行,在检查功能中
res=至少1d(thefunc(*(x0[:numput],)+args)))
文件“/home/joshua/anaconda2/lib/python2.7/site packages/scipy/optimize/minpack.py”,第454行,以函数形式包装
返回func(扩展数据,*参数)-ydata
文件“plot.py”,第57行,在函数中
积分=spi.quad(λzvar:AuxIntegrandum(zvar,ωλ),0.0,z)[0]
文件“/home/joshua/anaconda2/lib/python2.7/site packages/scipy/integrate/quadpack.py”,第323行,四行
积分)
文件“/home/joshua/anaconda2/lib/python2.7/site-packages/scipy/integrate/quadpack.py”,第372行,四格
如果(b!=Inf和a!=Inf):
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

简短回答:
曲线拟合
尝试在扩展数据数组上计算目标函数,但
四元组
无法接受向量参数。您需要通过例如输入数组上的列表理解来定义目标函数

让我们制作一个可重复性最低的示例:

In [33]: xdata = np.linspace(0, 3, 11)

In [34]: ydata = xdata**3

In [35]: def integr(x):
    ...:     return quad(lambda t: t**2, 0, x)[0]
    ...: 

In [36]: def func(x, a):
    ...:     return integr(x) * a
    ...: 

In [37]: curve_fit(func, xdata, ydata)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-37-4660c65f85a2> in <module>()
----> 1 curve_fit(func, xdata, ydata)

 [... removed for clarity ...]

~/virtualenvs/py35/lib/python3.5/site-packages/scipy/integrate/quadpack.py in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points)
    370 def _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points):
    371     infbounds = 0
--> 372     if (b != Inf and a != -Inf):
    373         pass   # standard integration
    374     elif (b == Inf and a != -Inf):

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

您没有在任何地方显式进行比较,因此它必须位于某个代码库中,可能是粘贴到了确切的错误中?谢谢!这最终奏效了,尽管显然math和numpy不能很好地协同工作,所以我不得不用np.log10()替换mh.log(DL,10),否则它会再次抱怨。
In [38]: def func2(x, a):
    ...:     return np.asarray([integr(xx) for xx in x]) * a
    ...: 

In [39]: curve_fit(func2, xdata, ydata)
Out[39]: (array([ 3.]), array([[  3.44663413e-32]]))