我有5个非参数模型,都有5到8个参数。该模型用于拟合纵向数据y(t),其中t为时间。所有5个模型都适合每个数据文件进行比较。模型本身不能改变。
对于拟合,使用起始值,并使用levenberg-marquardt algortihm将它们拟合到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]` 如果范围a1 = [150,180];范围a2 = [0.3,0.8],所以一个
有人可以给我一些提示或指示,因为我无法使其发挥作用。
提前致谢
露西有人能帮帮我吗
答案 0 :(得分:0)
您声明:有不同的模型具有不同的起始值和 允许的不同范围。 这是您可以使用{{ 1}}和ub
。如何执行此操作在lb
文档中列出:
lsqcurvefit
例如,在以下示例中,参数在拟合期间被限制在限制范围内。下限(X=LSQCURVEFIT(FUN,X0,XDATA,YDATA,LB,UB) defines a set of lower and
upper bounds on the design variables, X, so that the solution is in the
range LB <= X <= UB. Use empty matrices for LB and UB if no bounds
exist. Set LB(i) = -Inf if X(i) is unbounded below; set UB(i) = Inf if
X(i) is unbounded above.
)和上限(lb
)分别设置为低于和高于起始值的20%。
ub