首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fmincon -结果与原始参数不接近

fmincon -结果与原始参数不接近
EN

Stack Overflow用户
提问于 2016-12-07 18:19:38
回答 2查看 46关注 0票数 0

我试图用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);%

代码语言:javascript
复制
% 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)); 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-08 02:55:40

在提供代码示例时,至少要确保其工作正常,并包括定义测试数据的代码。

经过适当的修改使其工作,下面的代码显示,您的代码生成的解决方案是相当好的。你有一个相当非线性的函数,所以它的解是一个局部极小,而不是一个整体极小(即原始解),这并不奇怪。根据初始条件(即x0),您将得到稍微不同的结果。

对于这个问题,我还建议使用lsqcurvefit而不是fmincon。这方面的一个例子也在代码中。

代码语言:javascript
复制
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); 
票数 0
EN

Stack Overflow用户

发布于 2016-12-08 02:58:56

在提供代码示例时,至少要确保其工作正常,并包括定义测试数据的代码。

经过适当的修改使其工作,下面的代码显示,您的代码生成的解决方案是相当好的。你有一个相当非线性的函数,所以它的解是一个局部极小,而不是一个整体极小(即原始解),这并不奇怪。根据初始条件(即x0),您将得到稍微不同的结果。

对于这个问题,我还建议使用lsqcurvefit而不是fmincon。这方面的一个例子也在代码中。

代码语言:javascript
复制
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); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41024578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档