【问题标题】:Error in fminsearch to solve this 4-variable problem?解决这个 4 变量问题的 fminsearch 错误?
【发布时间】:2018-10-14 14:52:10
【问题描述】:

我正在尝试使用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

【问题讨论】:

    标签: matlab fminsearch


    【解决方案1】:

    你是对的,你的目标函数没有意义。你可以做一个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
    

    给我:

    编辑:

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

    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
    

    【讨论】:

    • 谢谢,除了最小二乘法之外,还有更精确/稳健的拟合吗?
    • 如果您安装了曲线拟合工具箱,您可以查看fit,它具有稳健拟合的选项,因为离群值在拟合中的权重较低。但是对于您的示例数据,没有任何异常值,因此最小二乘拟合应该没问题。另一方面,您可以发送spline interpolation
    • matlab 中还有一个粒子群优化工具
    • @JohnnyDrama,谢谢。您能否建议当 x(3) 来自 ode45 时 F 和 obj 将如何变化?
    • @JohnnyDrama,这非常有帮助,谢谢!我试图将上面的代码调整到一个新问题,其中需要适合 ode45 中的参数,但我无法使其工作。能否请您看一下代码?我已将其粘贴在代码共享处,可以在那里进行编辑 - codeshare.io/29Z4Y4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2013-11-23
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多