用MATLAB实现最小二乘法
时间: 2023-11-01 22:07:10 浏览: 45
最小二乘法是一种常用的数据拟合方法,可以用于线性回归、非线性回归等问题。下面是用MATLAB实现最小二乘法的基本步骤:
1. 准备数据。假设我们有 $n$ 个数据点 $(x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)$。
2. 确定模型。假设我们要拟合的模型是一个 $m$ 次多项式 $f(x)=a_0+a_1x+a_2x^2+\cdots+a_mx^m$。
3. 根据最小二乘法的思想,我们需要找到一组系数 $a_0,a_1,\cdots,a_m$,使得拟合函数 $f(x)$ 与实际数据点的误差平方和 $\sum\limits_{i=1}^n(f(x_i)-y_i)^2$ 最小。这个问题可以通过求解一个线性方程组来得到最优解。
4. 构造矩阵。设 $X$ 是一个 $n\times(m+1)$ 的矩阵,每一行为 $[1,x_i,x_i^2,\cdots,x_i^m]$,$Y$ 是一个 $n\times 1$ 的矩阵,每一行为 $y_i$。则有 $Xa=Y$,其中 $a=[a_0,a_1,\cdots,a_m]^T$。
5. 求解线性方程组。用 MATLAB 中的 backslash 运算符求解线性方程组即可得到系数向量 $a$。具体代码如下:
```matlab
X = [ones(n,1),x,x.^2,...,x.^m];
Y = y;
a = X\Y;
```
其中 `n` 是数据点的个数,`x` 和 `y` 分别是数据点的横纵坐标。
6. 绘制拟合曲线。根据求得的系数向量 $a$,可以得到拟合函数 $f(x)$,进而绘制拟合曲线。具体代码如下:
```matlab
xx = linspace(min(x),max(x),1000); % 生成一组等间距的横坐标值
yy = polyval(a,xx); % 计算对应的纵坐标值
plot(xx,yy,'r-'); % 绘制拟合曲线
```
上述代码中,`linspace` 函数用于生成一组等间距的横坐标值,`polyval` 函数用于计算对应的纵坐标值,`plot` 函数用于绘制拟合曲线。
完整代码如下:
```matlab
% 准备数据
n = 100; % 数据点个数
x = linspace(0,1,n)'; % 生成一组等间距的横坐标值
y = exp(x) + randn(n,1)*0.1; % 生成对应的纵坐标值(带有噪声)
% 确定模型
m = 5; % 多项式次数
% 构造矩阵并求解线性方程组
X = [ones(n,1),x,x.^2,x.^3,x.^4,x.^5];
Y = y;
a = X\Y;
% 绘制数据点和拟合曲线
plot(x,y,'b.',xx,yy,'r-');
legend('原始数据','拟合曲线');
```
运行结果如下图所示:
![最小二乘法拟合曲线示例](https://img-blog.csdnimg.cn/20211009154759667.png)