MATLAB的lsqnonlin函数拟合非线性式子中的未知参数

往往在实际问题中都存在exp(x)、lnx、sinx等多种函数组合的非线性经验公式。对此我们就可以通过lsqnonlin函数进行求解,该函数的方法被称为非线性最小二乘,损失函数一样,只不过类似于优化算法,给定参数初始值,然后优化参数,非线性最小二乘模型如下,即目标函数。


1. lsqnonlin语法

lsqnonlin函数用于求解非线性最小二乘(非线性数据拟合)问题。

语法
x=lsqnonlin(fun,x0)
x=lsqnonlin(fun,x0,lb,ub)
x=lsqnonlin(fun,x0,lb,ub,options)
x=lsqnonlin(problem)
[x,resnorm]=lsqnonlin(___)
[x,resnorm,residual,exitflag,output]=lsqnonlin(___)
[x,resnorm,residual,exitflag,output,lambda,jacobian]=lsqnonlin(___)
lb、ub为解向量的下界和上界lb a ub,若没有指定界,则lb=[ ],ub=[ ];
options为指定的优化参数;
fun为待拟合函数,计算x处拟合函数值,其定义为 function F = myfun(a,xdata)
resnorm=sum ((fun(a,xdata)-ydata).^2),即在a处残差的平方和;
residual=fun(a,xdata)-ydata,即在x处的残差;
exitflag为终止迭代的条件;
output为输出的优化信息;
lambda为解x处的Lagrange乘子;jacobian为解x处拟合函数fun的jacobian矩阵。

2. 拟合简单指数

对数据进行简单的指数衰减曲线拟合。

从添加了噪声的指数衰减模型生成数据。模型是:

y=exp( 1.3t)+ε

其中 t 的范围是从 0 到 3,ε 是均值为 0、标准差为 0.05 的正态分布噪声。

问题表述为:给定数据(d、y),求出与数据拟合最佳的指数衰减率。

创建一个匿名函数,该函数接受指数衰减率 r 的值作为输入,并返回采用该衰减率的模型与数据之差组成的向量。

程序

clc;
clear all;
close all;
rng default
% rng('default') 将 rand、randi 和 randn 使用的随机数生成器的设置重置为其默认值。
%这样,会生成相同的随机数,就好像您重新启动了 MATLAB。默认设置是种子为 0 的梅森旋转生成器。
d = linspace(0,3);
y = exp(-1.3*d) + 0.05*randn(size(d));
fun = @(r) exp(-d*r)-y;
%找到最佳衰减率的值。任意选择一个初始估计值 x0 = 4。
x0 = 4;
x = lsqnonlin(fun,x0)
%绘制数据和最佳拟合指数曲线。
plot(d,y,'ko',d,exp(-x*d),'b-')
legend('原始数据','拟合数据')
xlabel('t')
ylabel('exp(-tx)')

运行结果

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.



x =

    1.2645


3. 拟合具有边界约束的问题

当某些拟合参数有边界时,找到最佳拟合模型。找到合适的中心化参数 b 和缩放参数 a,以便拟合以下函数:a*exp( t)exp( exp( (t b)))。

程序

clc;
clear all;
close all;
%最好地拟合以下标准正态密度分布:
%创建数据点组成的向量 t,以及在这些点上的对应正态密度。
t = linspace(-4,4);
y = 1/sqrt(2*pi)*exp(-t.^2/2);
%创建一个缩放参数 a 为 x(1) 且中心化参数 b 为 x(2) 的函数,来计算中心化并缩放的函数与正态 y 之间的差。
fun = @(x)x(1)*exp(-t).*exp(-exp(-(t-x(2)))) - y;
%从 x0 = [1/2,0] 开始寻找最佳拟合,缩放参数 a 的值介于 1/2 和 3/2 之间,中心化参数 b 的值介于 -1 和 3 之间。
lb = [1/2,-1];
ub = [3/2,3];
x0 = [1/2,0];
x = lsqnonlin(fun,x0,lb,ub)
%绘制这两个函数来查看拟合的质量。
plot(t,y,'r-',t,fun(x)+y,'b-')
xlabel('t')
legend('原始数据函数曲线','拟合函数曲线')

运行结果

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.



x =

    0.8231   -0.2444


4. 检查求解过程

在求解过程发生时和发生后都对其进行检查(通过将 Display 选项设置为 'iter' 在发生时进行检查,通过检查 output 结构体在发生后进行检查)。

假设您有观测时间数据 xdata 和观测响应数据 ydata,并且要求得参数 x(1) 和 x(2) 以拟合以下形式的模型:ydata=x(1)exp(x(2)xdata)。

程序


clc;
clear all;
close all;
% 输入观测时间和响应。
xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
% 创建简单的指数衰减模型。该模型计算预测值和观测值之间的差组成的向量。

fun = @(x)x(1)*exp(x(2)*xdata)-ydata;
% 以 x0 = [100,-1] 为起点拟合模型。通过将 Display 选项设置为 'iter' 来检查求解过程。获取 output 结构体以获取有关求解过程的详细信息。
x0 = [100,-1];
options = optimoptions('lsqnonlin','Display','iter','PlotFcn','optimplotx');
[x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options)
%Algorithm在 'trust-region-reflective'(默认值)和 'levenberg-marquardt' 之间进行选择。
options.Algorithm = 'levenberg-marquardt';
[x1,resnorm1,residual1,exitflag1,output1] = lsqnonlin(fun,x0,[],[],options)

运行结果

                                      Norm of      First-order 
 Iteration  Func-count     f(x)          step          optimality
     0          3          359677                      2.88e+04
Objective function returned Inf; trying a new point...
     1          6          359677        11.6976       2.88e+04      
     2          9          321395            0.5       4.97e+04      
     3         12          321395              1       4.97e+04      
     4         15          292253           0.25       7.06e+04      
     5         18          292253            0.5       7.06e+04      
     6         21          270350          0.125       1.15e+05      
     7         24          270350           0.25       1.15e+05      
     8         27          252777         0.0625       1.63e+05      
     9         30          252777          0.125       1.63e+05      
    10         33          243877        0.03125       7.48e+04      
    11         36          243660         0.0625        8.7e+04      
    12         39          243276         0.0625          2e+04      
    13         42          243174         0.0625       1.14e+04      
    14         45          242999          0.125        5.1e+03      
    15         48          242661           0.25       2.04e+03      
    16         51          241987            0.5       1.91e+03      
    17         54          240643              1       1.04e+03      
    18         57          237971              2       3.36e+03      
    19         60          232686              4       6.04e+03      
    20         63          222354              8        1.2e+04      
    21         66          202592             16       2.25e+04      
    22         69          166443             32       4.05e+04      
    23         72          106320             64       6.68e+04      
    24         75         28704.7            128       8.31e+04      
    25         78         89.7947        140.674       2.22e+04      
    26         81         9.57381        2.02599            684      
    27         84         9.50489      0.0619926           2.27      
    28         87         9.50489    0.000462262         0.0114      
Local minimum possible.
lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

x =
  498.8309   -0.1013
resnorm =
    9.5049
residual =
    0.1817   -0.0610   -0.7628   -0.1196    0.2659    0.5979    1.0261    1.5124    1.5615    1.6327
exitflag =

     3
output = 

  包含以下字段的 struct:

    firstorderopt: 0.0114
       iterations: 28
        funcCount: 87
     cgiterations: 0
        algorithm: 'trust-region-reflective'
         stepsize: 4.6226e-04
          message: ' Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to  its initial value is less than the value of the function tolerance.  Optimization stopped because the relative sum of squares (r) is changing by less than options.FunctionTolerance = 1.000000e-06. '

                                        First-Order                    Norm of 
 Iteration  Func-count    Residual       optimality      Lambda           step
     0           3          359677        2.88e+04         0.01
Objective function returned Inf; trying a new point...
     1          13          340761        3.91e+04       100000       0.280777
     2          16          304661        5.97e+04        10000       0.373146
     3          21          297292        6.55e+04        1e+06      0.0589933
     4          24          288240        7.57e+04       100000      0.0645444
     5          28          275407        1.01e+05        1e+06      0.0741266
     6          31          249954        1.62e+05       100000       0.094571
     7          36          245896        1.35e+05        1e+07      0.0133606
     8          39          243846        7.26e+04        1e+06     0.00944311
     9          42          243568        5.66e+04       100000     0.00821622
    10          45          243424        1.61e+04        10000     0.00777936
    11          48          243322         8.8e+03         1000      0.0673933
    12          51          242408         5.1e+03          100       0.675209
    13          54          233628        1.05e+04           10        6.59804
    14          57          169089        8.51e+04            1        54.6992
    15          60         30814.7        1.54e+05          0.1        196.939
    16          63         147.496           8e+03         0.01        129.795
    17          66         9.51503             117        0.001        9.96069
    18          69         9.50489          0.0714       0.0001       0.080486
    19          72         9.50489        4.96e-05        1e-05    5.07028e-05
Local minimum possible.
lsqnonlin stopped because the relative size of the current step is less than
the value of the step size tolerance.

x1 =
  498.8309   -0.1013
resnorm1 =
    9.5049
residual1 =
    0.1817   -0.0610   -0.7628   -0.1196    0.2659    0.5979    1.0261    1.5124    1.5615    1.6327
exitflag1 =

     4
output1 = 
  包含以下字段的 struct:
       iterations: 19
        funcCount: 72
         stepsize: 5.0703e-05
     cgiterations: []
    firstorderopt: 4.9629e-05
        algorithm: 'levenberg-marquardt'
          message: ' Local minimum possible. lsqnonlin stopped because the relative size of the current step is less than the value of the step size tolerance.  Optimization stopped because the relative norm of the current step, 1.016433e-07, is less than options.StepTolerance = 1.000000e-06. '


5.属性设置

优化选项,指定为 optimoptions 的输出或 optimset 返回的结构体。
MaxIterations
允许的迭代最大次数,为正整数。默认值为 400。
OptimalityTolerance
一阶最优性的终止容差(正标量)。默认值为 1e-6。
PlotFcn
对算法执行过程中的各种进度测量值绘图,可以选择预定义的绘图,也可以自行编写绘图函数。传递名称、函数句柄或者由名称或函数句柄组成的元胞数组。对于自定义绘图函数,传递函数句柄。默认值是“无”([]):
'optimplotx' 绘制当前点。
'optimplotfunccount' 绘制函数计数。
'optimplotfval' 绘制函数值。
'optimplotresnorm' 绘制残差范数。
'optimplotstepsize' 绘制步长大小。
'optimplotfirstorderopt' 绘制一阶最优性度量。

参考内容

[1] https://ww2.mathworks.cn/help/optim/ug/lsqnonlin.html

作者:郭志龙
编辑:郭志龙
校对:郭志龙

展开阅读全文

页面更新:2024-04-20

标签:函数   式子   参数   句柄   向量   缩放   曲线   模型   指数   过程   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top