我试图用MATLAB的fmincon函数来解决一个问题。下面显示了一个等式,为此我使用一些时间点生成了测试数据。我希望使用优化方法,根据生成的测试数据估计参数x(1)、x(2)和x(3)。当前使用fmincon估计的参数与用于生成数据的初始参数不接近。任何帮助都将不胜感激。
测试数据.时间点= 10:10:300,500,700,1000;x= 0.1,0.5,0.3;兴趣数据%参数=使用测试方程生成数据的x(1)*sin(x(2).*Timepoints)+log(x(3).*Timepoints);%
% Parameters used to run the fmincon
x0 = [0, 0.1, 0.1]; % initial guess
lb = zeros(1, length(x0)); % lower bound of parameters
ub = ones(1, length(x0)); % upper bound of parameters
[x, fval, exitflag, output] = fmincon(@modelA1, x0, [], [], [], [], lb, ub, [], options, Timepoints, Data);
function fvalues = modelA(x, Timepoints, fvals)
Fvalues = zeros(1, length(Timepoints));
PreFvalues = zeros(1, length(Timepoints));
for Temp = 1:length(Timepoints)
tempY = x0(1)*sin(x0(2).*Timepoints(Temp))+log(x0(3).*Timepoints(Temp));
PreFvalues(Temp) = (fvals(Temp)-tempY)^2;
end
fvalues=sqrt(sum(PreFvalues)); 发布于 2016-12-08 02:55:40
在提供代码示例时,至少要确保其工作正常,并包括定义测试数据的代码。
经过适当的修改使其工作,下面的代码显示,您的代码生成的解决方案是相当好的。你有一个相当非线性的函数,所以它的解是一个局部极小,而不是一个整体极小(即原始解),这并不奇怪。根据初始条件(即x0),您将得到稍微不同的结果。
对于这个问题,我还建议使用lsqcurvefit而不是fmincon。这方面的一个例子也在代码中。
function test
Timepoints = [10:10:300, 500, 700, 1000]; x = [0.1, 0.5, 0.3];
Data = x(1)*sin(x(2).*Timepoints)+log(x(3).*Timepoints);
options = optimoptions('fmincon');
% Parameters used to run the fmincon
x0 = [0, 0.1, 0.1]; % initial guess
lb = zeros(1, length(x0)); % lower bound of parameters
ub = ones(1, length(x0)); % upper bound of parameters
[x, fval, exitflag, output] = fmincon(@modelA, x0, [], [], [], [], lb, ub, [], options, Timepoints, Data);
% Using lsqcurvefit
F = @(x,xData)x(1)*sin(x(2).*xData)+log(x(3).*xData);
x = lsqcurvefit(F,x0,Timepoints,Data,lb,ub);
plot(...
Timepoints,Data,...
Timepoints,x(1)*sin(x(2).*Timepoints)+log(x(3).*Timepoints),...
Timepoints,F(x,Timepoints));
legend({'Original','fmincon','lsqcurvefit'});
function fvalues = modelA(x, Timepoints, fvals)
tempY = x(1)*sin(x(2)*Timepoints)+log(x(3)*Timepoints);
PreFvalues = (fvals-tempY).^2;
fvalues=sum(PreFvalues); 发布于 2016-12-08 02:58:56
在提供代码示例时,至少要确保其工作正常,并包括定义测试数据的代码。
经过适当的修改使其工作,下面的代码显示,您的代码生成的解决方案是相当好的。你有一个相当非线性的函数,所以它的解是一个局部极小,而不是一个整体极小(即原始解),这并不奇怪。根据初始条件(即x0),您将得到稍微不同的结果。
对于这个问题,我还建议使用lsqcurvefit而不是fmincon。这方面的一个例子也在代码中。
function test
Timepoints = [10:10:300, 500, 700, 1000]; x = [0.1, 0.5, 0.3];
Data = x(1)*sin(x(2).*Timepoints)+log(x(3).*Timepoints);
options = optimoptions('fmincon');
% Parameters used to run the fmincon
x0 = [0, 0.1, 0.1]; % initial guess
lb = zeros(1, length(x0)); % lower bound of parameters
ub = ones(1, length(x0)); % upper bound of parameters
[x, fval, exitflag, output] = fmincon(@modelA, x0, [], [], [], [], lb, ub, [], options, Timepoints, Data);
% Using lsqcurvefit
F = @(x,xData)x(1)*sin(x(2)*xData)+log(x(3)*xData);
x = lsqcurvefit(F,x0,Timepoints,Data,lb,ub);
plot(...
Timepoints,Data,...
Timepoints,x(1)*sin(x(2).*Timepoints)+log(x(3).*Timepoints),...
Timepoints,F(x,Timepoints));
legend({'Original','fmincon','lsqcurvefit'});
function fvalues = modelA(x, Timepoints, fvals)
tempY = x(1)*sin(x(2)*Timepoints)+log(x(3)*Timepoints);
PreFvalues = (fvals-tempY).^2;
fvalues=sum(PreFvalues); https://stackoverflow.com/questions/41024578
复制相似问题