数学建模课程笔记【散人】数学建模数学建模艺术

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

2019-08-23  本文已影响7人  热爱学习的高老板

在无约束最优化问题中,有些重要的特殊情形,比如目标函数由若干个函数的平方和构成。这类函数一般可以写成:
F(x)=\sum_{i=1}^{m} f_{i}^{2}(x), x \in R^{n}
其中x=\left(x_{1}, \cdots, x_{n}\right)^{T},一般假设m \geq n。我们把极小化这类函数的问题:
\min F(x)=\sum_{i=1}^{m} f_{i}^{2}(x)
称为最小二乘优化问题。

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

1.lsqlin函数

求解\min _{x} \frac{1}{2}\|C x-d\|_{2}^{2}
s.t. \left\{\begin{array}{l}{A^{*} x \leq b} \\ {\text {Aeq}^{*} x=b e q} \\ {l b \leq x \leq u b}\end{array}\right.
其中C, A, A e q为矩阵,d, b, b e q, l b, u b, x为向量。
Matlab函数为:
x=lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0)

例1 用Isqlin函数求一个形如y=a+b x^{2}的经验公式,使它与下表所示的数据拟合。

x 19 25 31 38 44
y 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函数

给定输入输出数列xdata,ydata,求参量x使得
\min _{x} \frac{1}{2} \| F(x, x{ data })-y d a t a \|_{2}^{2}=\frac{1}{2} \sum_{i}\left(F\left(x, x{ dat } a_{i}\right)-y d a t a_{i}\right)^{2}

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

例2 用下面表中的数据拟合函数c(t)=a+b e^{-0.02 k t}中的参数a, b, k

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

解:这个问题即解最优化问题:
\min F(a, b, k)=\sum_{i=1}^{10}\left(a+b e^{-0.02 k t_{j}}-c_{j}\right)^{2}

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

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函数

已知函数向量F(x)=\left[f_{1}(x), \cdots, f_{k}(x)\right]^{T},求x使得:
\min _{x} \frac{1}{2}\|F(x)\|_{2}^{2}
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函数

求解非负x,使得满足\min _{x} \frac{1}{2}\|C x-d\|_{2}^{2}
Matlab中的函数为:

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

例3 已知C=\left[\begin{array}{ll}{0.0372} & {0.2869} \\ {0.6861} & {0.7071} \\ {0.6233} & {0.6245} \\ {0.6344} & {0.6170}\end{array}\right]d=\left[\begin{array}{l}{0.8587} \\ {0.1781} \\ {0.0747} \\ {0.8405}\end{array}\right],求x(x \geq 0)满足\min _{x} \frac{1}{2}\|C x-d\|_{2}^{2}最小。

编写程序如下:

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)
上一篇下一篇

猜你喜欢

热点阅读