微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scipy:如何曲线拟合隐式标量函数?

如何解决Scipy:如何曲线拟合隐式标量函数?

对于隐式标量函数,是否可以将 scipy.optimize.curve_fitscipy.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]

现在,我知道尝试自动查找根时可能会出错的所有事情(尽管二分应该是稳定的,前提是 ab 之间有根>);然而,我得到的错误似乎与 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 举报,一经查实,本站将立刻删除。