如何解决Scipy:如何曲线拟合隐式标量函数?
对于隐式标量函数,是否可以将 scipy.optimize.curve_fit
与 scipy.optimize.bisect
(或 fsolve
或其他)串联?
在实践中,看看这个 Python 代码,我尝试定义一个隐式函数并将它传递给 curve_fit
以获得最适合参数的:
import numpy as np
import scipy.optimize as opt
import scipy.special as spc
# Estimate of initial parameter (not really important for this example)
fact,_,_ = spc.airy(-1.0188)
par0 = -np.log(2.0*fact*(18**(1.0/3.0))*np.pi*1e-6)
# DeFinition of an implicit parametric function f(c,t;b)=0
def func_impl(c,t,p) :
return ( c - ((t**3)/9.0) / ( np.log(t*(c**(1.0/3.0))) + p ) )
# deFinition of the function I believe should be passed to curve_fit
def func_egg(t,p) :
x_st,_ = opt.bisect( lambda x : func_impl(x,p),a=0.01,b=0.3 )
return x_st
# Some data points
t_data = np.deg2rad(np.array([95.0,69.1,38.8,14.7]))
c_data = np.array([0.25,0.10,0.05,0.01])
# Call to curve_fit
popt,pcov = opt.curve_fit(func_egg,t_data,c_data,p0=par0)
b = popt[0]
现在,我知道尝试自动查找根时可能会出错的所有事情(尽管二分应该是稳定的,前提是 a 和 b 之间有根>);然而,我得到的错误似乎与 func_impl
的输出维度有关:
Traceback (most recent call last):
File "example_fit.py",line 23,in <module>
popt,p0=par0)
File "/usr/local/lib/python3.7/site-packages/scipy/optimize/minpack.py",line 752,in curve_fit
res = leastsq(func,p0,Dfun=jac,full_output=1,**kwargs)
File "/usr/local/lib/python3.7/site-packages/scipy/optimize/minpack.py",line 383,in leastsq
shape,dtype = _check_func('leastsq','func',func,x0,args,n)
File "/usr/local/lib/python3.7/site-packages/scipy/optimize/minpack.py",line 26,in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "/usr/local/lib/python3.7/site-packages/scipy/optimize/minpack.py",line 458,in func_wrapped
return func(xdata,*params) - ydata
File "example_fit.py",line 15,in func_egg
x_st,b=0.3 )
File "/usr/local/lib/python3.7/site-packages/scipy/optimize/zeros.py",line 550,in bisect
r = _zeros._bisect(f,a,b,xtol,rtol,maxiter,full_output,disp)
File "example_fit.py",in <lambda>
x_st,b=0.3 )
File "example_fit.py",line 11,in func_impl
return ( c - ((t**3)/9.0) / ( np.log(t*(c**(1.0/3.0))) + p ) )
TypeError: only size-1 arrays can be converted to Python scalars
我的猜测是 curve_fit
基本上将输入函数的输出视为与输入数据具有相同维度的向量;我虽然可以通过“向量化”隐式函数或 func_egg
轻松解决此问题,但它看起来并不像我想象的那么简单。
我错过了什么吗?有没有简单的解决方法?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。