MATLAB最小二乘法求拟合曲线
时间: 2025-07-19 17:12:26 浏览: 3
MATLAB 提供了多种实现最小二乘法曲线拟合的方法,既可以使用内置函数简化操作,也可以手动构造矩阵进行求解。以下分别介绍这两种方式,并给出具体示例。
### 使用 `polyfit` 函数进行多项式拟合
MATLAB 中的 `polyfit(x, y, n)` 函数可用于对数据点 `(x, y)` 进行 `n` 次多项式拟合。它返回拟合多项式的系数向量 `p`,其中 `p(1)` 为最高次项的系数,依次递减到常数项。例如,对于一次多项式(即直线拟合),可以使用如下代码:
```matlab
x = 1:10;
y = 2*x + 3 + randn(1, 10); % 添加噪声
p = polyfit(x, y, 1); % 一次多项式拟合
y_fit = polyval(p, x); % 计算拟合值
plot(x, y, 'bo', x, y_fit, 'r-');
xlabel('x');
ylabel('y');
title('polyfit拟合结果');
legend('原始数据', '拟合直线');
```
此方法适用于多项式形式的曲线拟合,如需进行非线性函数拟合,则需要采用其他方法[^2]。
### 手动构造矩阵进行最小二乘求解
对于一般的线性最小二乘问题,可以通过构造设计矩阵 `X` 和目标向量 `y` 来求解参数 `beta`,其公式为:
$$
\beta = (X^T X)^{-1} X^T y
$$
在 MATLAB 中可以使用左除运算符 `\` 来求解:
```matlab
% 生成数据
x = 1:10;
y = 2*x + 3 + randn(1, 10);
% 构造设计矩阵
X = [ones(length(x), 1), x']; % 添加一列用于截距项
% 最小二乘求解
beta = (X' * X) \ (X' * y');
% 提取参数
beta0 = beta(1); % 截距
beta1 = beta(2); % 斜率
% 计算拟合值
y_fit = beta0 + beta1 * x;
% 绘图展示结果
figure;
plot(x, y, 'bo', 'DisplayName', '原始数据');
hold on;
plot(x, y_fit, 'r-', 'DisplayName', '拟合直线');
xlabel('x');
ylabel('y');
title('最小二乘法拟合直线');
legend('show');
grid on;
% 显示拟合结果
fprintf('拟合结果: y = %.2f + %.2f * x\n', beta0, beta1);
```
该方法适用于线性模型的最小二乘拟合,且可扩展至多变量回归问题[^3]。
### 非线性最小二乘拟合
对于非线性模型,如 `y = a * ln(x) + b`,MATLAB 提供了 `lsqcurvefit` 或 `nlinfit` 等函数来进行非线性最小二乘拟合。例如,使用 `lsqcurvefit` 的示例代码如下:
```matlab
% 生成非线性数据
x = 1:0.1:10;
y = 2*log(x) + 3 + randn(size(x)); % 添加噪声
% 定义拟合函数
fun = @(params, xdata) params(1)*log(xdata) + params(2);
% 初始猜测值
initial_guess = [1, 1];
% 进行非线性拟合
params = lsqcurvefit(fun, initial_guess, x, y);
% 计算拟合值
y_fit = fun(params, x);
% 绘图展示结果
figure;
plot(x, y, 'bo', x, y_fit, 'r-');
xlabel('x');
ylabel('y');
title('非线性最小二乘拟合');
legend('原始数据', '拟合曲线');
```
此方法适用于无法通过线性变换直接处理的非线性模型[^4]。
阅读全文
相关推荐


















