fit 拟合自定义函数结果异常,如何处理?
技术分享
发布于 2025-07-22 14:55:30
查看 2过去315天
问题现象
using TyCurveFitting
k=1e5:1e5:5e7
t=50e-9
g=100e-9
a=10e-9
delta=3e-9
S0=1e9
d=30e-9
y=zeros(size(k))
for i=1:size(k)[1]
y[i]=S0*exp(-1*k[i]*(d+a))*(1-exp(-1*k[i]*t))/k[i]*sin(k[i]*g/2)*sin(k[i]*(g+delta)/2)/(k[i]*g/2)
end
mtrans=fittype("S0*exp(-k*(d+a))*(1-exp(-k*t))/k*sin(k*g/2)*sin(k*(g+delta)/2)/(k*g/2)",coefficients=["S0", "d" , "g" ],independent="k",problem=["a","t","delta"])
mfit=fit(mtrans,k,y,lb=[1e8,1e-9,0],ub=[1e10,1e-7,1e-6],startpoints=[1e9,30e-9,1e-7],problem=[a,t,delta])
运行以上代码,拟合结果中拟合参数 S0 应该为 1e9,另外两个数的量级应该是1e-8,但实际结果不符:

解决方法
由于使用的关键词参数有误,导致拟合参数结果异常,需要修改关键词参数 startpoints 为 startpt:
1.将上述代码修改为以下:
using TyCurveFitting
k=1e5:1e5:5e7
t=50e-9
g=100e-9
a=10e-9
delta=3e-9
S0=1e9
d=30e-9
y=zeros(size(k))
for i=1:size(k)[1]
y[i]=S0*exp(-1*k[i]*(d+a))*(1-exp(-1*k[i]*t))/k[i]*sin(k[i]*g/2)*sin(k[i]*(g+delta)/2)/(k[i]*g/2)
end
mtrans=fittype("S0*exp(-k*(d+a))*(1-exp(-k*t))/k*sin(k*g/2)*sin(k*(g+delta)/2)/(k*g/2)",coefficients=["S0", "d" , "g" ],independent="k",problem=["a","t","delta"])
# mfit=fit(mtrans,k,y,lb=[1e8,1e-9,0],ub=[1e10,1e-7,1e-6],startpoints=[1e9,30e-9,1e-7],problem=[a,t,delta])
# 修改关键词参数 startpoints 为 startp
mfit=fit(mtrans,k,y,lb=[1e8,1e-9,0],ub=[1e10,1e-7,1e-6],startpt=[1e9,30e-9,1e-7],problem=[a,t,delta])
2.运行上述代码,可以看到此时拟合参数结果符合:

所属专栏:工具箱
产品信息:Syslab科学计算环境