我有 5 个非参数模型,都有 5 到 8 个参数。该模型用于拟合纵向数据 y(t),其中 t 为时间。每个数据文件都适合所有 5 个模型进行比较。模型本身不能更改。
使用初始值进行拟合,并使用 levenberg-marquardt 算法将这些值拟合到 lsqcurvefit 模型中。所以我为几个模型和一个曲线拟合函数编写了一个脚本
如果我执行曲线拟合,很多起始值都会漂移到极值。这是我要避免的事情,因为这些参数应该保持在其起始值附近,并且应该只在明确定义的范围之间变化,或者只包括标准偏差内的曲线拟合。这里要注意的重要一点是这个限制应该在曲线拟合期间(迭代计算技术)而不是之后施加。
我为使模型适应高度而编写的函数:
% Fit a specific model for all valid persons
try
opts = optimoptions(@lsqcurvefit, 'Algorithm', 'levenberg-marquardt');
[personalParams,personalRes,personalResidual] = lsqcurvefit(heightModel,initialValues,personalData(:,1),personalData(:,2),[],[],opts);
catch
x=1;
end
我为我的一个模型编写的函数
elseif strcmpi(model,'jpss')
% y = h_1(1-(1/(1+((t+0.75)^c_1/d_1)+((t+0.75)^c_2/d_2)+((t+0.75)^c_3/d_3)))
% heightModel = @(params,ages) params(1).*(1-1./(1+((ages+0.75).^params(2))./params(3) + ((ages+0.75).^params(4))./params(5) + ((ages+0.75).^params(6))./params(7)));
heightModel = @(params,ages) params(1).*(1-1./(1+(((ages+0.75)./params(3)).^params(2)) + (((ages+0.75)./params(5)).^params(4)) + ((ages+0.75)./params(7)).^params(6))); % Adapted 25/07
modelStrings = {'h1','c1','d1','c2','d2','c3','d3'};
% Define initial values
if strcmpi('male',gender)
initialValues = [174.8 0.6109 2.9743 3.614 9.88 22.393 13.59];
else
initialValues = [162.7 0.6546 2.43 4.011 8.579 18.394 11.846];
end
我想做的事:
是否可以对每个起始值 @initial 值进行限制?我认为对 lsqcurvefit 施加限制不是一个好主意,因为不同的模型具有不同的起始值和不同的允许范围。
我脑子里有两件事:1. 使用范围并将其放在初始值之间 initialValues = [162.7 0.6546 2.43 4.011 8.579 18.394 11.846]` if range a1=[150,180]; 范围 a2=[0.3,0.8] 等等
- 如果 Heightmodel='name model' 初始值* 1.2 和 lb = 初始值* 0.8,则在 lsqcurvefit 之间的所有初始值上分别放置 lb 和 ub 限制
有人可以给我一些提示或指示,因为我无法使其工作。
提前致谢
露西
有人可以帮我吗