打算用该工具拟合某条曲线,该曲线主要函数由两个(μa,mμs是待求解的参数)
其余的都是这两个参数的衍生参数,但是拟合时出现这个错误:
RuntimeWarning: invalid value encountered in sqrt
μeff=np.sqrt((3*μa*mμs))
应该是某一次拟合时,导致μeff的值为零,而这个值在拟合公式中又会充当除数
也就是分母为0的情况。optimize.leastsq能否将待拟合的参数限定在某个范围,比如μa,mμs都大于0。
代码:
import numpy as np
from scipy import optimize
def farrell(r,p):
#数据所拟合的函数,Farrell漫反射反演模型
μa,mμs=p
Nrel=1.40
Reff=-1.440*Nrel**-2+0.701*Nrel**-1+0.668+0.0636*Nrel
μt=μa+mμs
ma=mμs/(μa+mμs)
μeff=np.sqrt((3*μa*mμs))
D=μa/(μeff**2)
Zb=2*D*(1+Reff)/(1-Reff)
r1=(r**2+μt**-2)**0.5
r2=((1/μt+2*Zb)**2+r**2)**0.5
return (0.25*ma/np.pi)*((1/μt)*(μeff+1/r1)*np.exp(-μeff*r1)*(r1**-2)+(1/μt+2*Zb)*(μeff+1/r2)*np.exp(-μeff*r2)*(r2**-2))
def residuals(p,y,x):
return y-farrell(x,p)
x=np.linspace(0,1,100)
y0=farrell(x,[0.0020,63.35])
p0=[0.11,20]
plsq=optimize.leastsq(residuals,p0,args=(y0,x))