解决此4变量问题的fminsearch错误?

时间:2018-09-29 16:08:52

标签: matlab fminsearch

我正在尝试使用fminsearch来解决以下等式,但是我认为目标函数是错误的。

我应该如何编写目标函数或修改代码的任何其他部分?这基本上是一个拟合问题,在该过程中,优化过程应使方程适合给定数据。

% Consider the following data:

Data = ...
  [0.0000    5.8955
   0.1000    3.5639
   0.2000    2.5173
   0.3000    1.9790
   0.4000    1.8990
   0.5000    1.3938
   0.6000    1.1359
   0.7000    1.0096
   0.8000    1.0343
   0.9000    0.8435
   1.0000    0.6856
   1.1000    0.6100
   1.2000    0.5392
   1.3000    0.3946
   1.4000    0.3903
   1.5000    0.5474
   1.6000    0.3459
   1.7000    0.1370
   1.8000    0.2211
   1.9000    0.1704
   2.0000    0.2636];

% Let's plot these data points.
t = Data(:,1);
y = Data(:,2);

plot(t,y,'ro')
title('Data points')
hold on

% fit the function: y =  c(1)*exp(-lam(1)*t) + c(2)*exp(-lam(2)*t)
%
% define the parameters in terms of one variable x:
%  x(1) = c(1)
%  x(2) = lam(1)
%  x(3) = c(2)
%  x(4) = lam(2)
%
% Then define the curve as a function of the parameters x and the data t:

F = @(x,t)(x(1)*exp(-x(2)*t) + x(3)*exp(-x(4)*t));

% We arbitrarily set our initial point x0 as follows: c(1) = 1,
% lam(1) = 1, c(2) = 1, lam(2) = 0:

x0 = [1 1 1 0];

% We run the solver and plot the resulting fit
options = optimset('TolFun',1e-5,'TolX',1e-5,'MaxFunEvals',10,'MaxIter',4000,'Display','iter');
[x,fval,exitflag,output] = fminsearch(F,x0,options)

plot(t,F(x,t))
hold off

1 个答案:

答案 0 :(得分:2)

您是对的,您的目标函数没有意义。您可以执行least squares fitting。然后将目标函数定义为:

F = @(x,t) (x(1)*exp(-x(2)*t) + x(3)*exp(-x(4)*t));
Obj = @(x) (norm(F(x, Data(:,1))-Data(:,2)));

然后

x0 = [1 1 1 0];
options = optimset('TolFun',1e-5, 'TolX', 1e-5, 'MaxFunEvals',1000, 'MaxIter', 4000,'Display','iter');
[x,fval,exitflag,output] = fminsearch(Obj,x0,options);

tp = 0:0.01:2;
plot(Data(:,1), Data(:,2), 'ro');
title('Data points')
hold on
plot(tp,F(x,tp));
hold off

给我:

enter image description here

编辑:

假设您已经知道一个参数并且想要使用函数句柄,则可以这样做

p = ... % Your calculation to get the parameter. In your case x(3) from the previous F
F = @(x, p, t) (x(1)*exp(-x(2)*t) + p*exp(-x(3)*t));
helper = @(x, p) (norm(F(x, p, Data(:,1))-Data(:,2)));
Obj = @(x) (helper(x, p));

x0 = [1 1 0]; % Note that there's now one variable/parameter less
options = optimset('TolFun',1e-5, 'TolX', 1e-5, 'MaxFunEvals',1000, 'MaxIter', 4000,'Display','iter');
[x,fval,exitflag,output] = fminsearch(Obj,x0,options);

tp = 0:0.01:2;
plot(Data(:,1), Data(:,2), 'ro');
title('Data points')
hold on
plot(tp,F(x,p,tp)); % Note that you need to pass p to F
hold off