【数学建模算法】(28)插值和拟合:最小二乘优化

在无约束最优化问题中,有些重要的特殊情形,比如目标函数由若干个函数的平方和构成。这类函数一般可以写成:

其中,一般假设。我们把极小化这类函数的问题:

称为最小二乘优化问题。

最小二乘优化是一类比较特殊的优化问题,在处理这类问题时,Matlab也提供了一些强大的函数。在 Matlab 优化工具箱中,用于求解最小二乘优化问题的函数有:lsqlin、lsqcurvefit、lsqnonlin、lsqnonneg,用法介绍如下。

1.lsqlin函数

求解
s.t.
其中为矩阵,为向量。
Matlab函数为:
x=lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0)

例1 用Isqlin函数求一个形如的经验公式,使它与下表所示的数据拟合。

19 25 31 38 44
19.0 32.3 49.0 73.3 97.8

解:程序如下:

x=[19 25 31 38 44]';
y=[19.0 32.3 49.0 73.3 97.8]';
r=[ones(5,1),x.^2];
ab=lsqlin(r,y)
x0=19:0.1:44;
y0=ab(1)+ab(2)*x0.^2;
plot(x,y,'o',x0,y0,'r')

2.lsqcurvefit函数

给定输入输出数列,求参量使得

Matlab中的函数为:
X=lsqcurvefit(FUN,X0,XDATA,YDATA,LB,UB,OPTIONS)
其中FUN是定义函数的N文件。

例2 用下面表中的数据拟合函数中的参数。

100 200 300 400 500 600 700 800 900 1000
4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59

解:这个问题即解最优化问题:

解这个问题要分两步:
首先编写待求函数:

function f=fun1(x,tdata);
f=x(1)+x(2)*exp(-0.02*x(3)*tdata); %其中 x(1)=a,x(2)=b,x(3)=k

其中参数x是原函数的待求参数列表,xdata是函数自变量。
之后在主函数中调用lsqcurvefit,编写程序:

td=100:100:1000;
cd=[4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59];
x0=[0.2 0.05 0.05];
x=lsqcurvefit(@fun1,x0,td,cd)

3.lsqnonlin函数

已知函数向量,求使得:

Matlab中的函数为:

X=lsqnonlin(FUN,X0,LB,UB,OPTIONS)

用该函数求解例2:
首先编写含有待求参数的函数:

function f=fun2(x);
td=100:100:1000;
cd=[4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59];
f=x(1)+x(2)*exp(-0.02*x(3)*td)-cd;

之后调用函数lsqnonlin,编写如下程序:

x0=[0.2 0.05 0.05]; %初始值是任意取的
x=lsqnonlin(@fun2,x0)

4.lsqnonneg函数

求解非负的,使得满足
Matlab中的函数为:

X =lsqnonneg(C,d,X0,OPTIONS)

例3 已知,,求满足最小。

编写程序如下:

c=[0.0372 0.2869;0.6861 0.7071;0.6233 0.6245;0.6344 0.6170];
d=[0.8587;0.1781;0.0747;0.8405];
x=lsqnonneg(c,d)

你可能感兴趣的:(【数学建模算法】(28)插值和拟合:最小二乘优化)