非线性最小二乘法matlab代码完整版
时间: 2023-10-15 22:01:13 浏览: 212
非线性最小二乘法(Nonlinear Least Squares,NLLS)是一种常用的数值优化方法,用于拟合非线性模型与观测数据之间的关系。下面是一个完整的MATLAB代码示例:
```matlab
% 定义非线性模型函数
function y = nonlinearModel(x, p)
% x:输入变量
% p:模型参数
% y:输出变量
y = p(1) * exp(p(2) * x);
end
% 定义目标函数:最小化观测值与模型值之间的残差平方和
function residuals = objective(p, x, y)
% p:模型参数
% x:输入变量
% y:观测值
% residuals:残差
residuals = y - nonlinearModel(x, p);
end
% 生成观测数据
x = linspace(0, 1, 100); % 输入变量
p_true = [2, -0.5]; % 真实参数
y_true = nonlinearModel(x, p_true); % 根据真实参数生成观测值
noise = 0.1*randn(size(x)); % 加入噪声
y = y_true + noise; % 加入噪声后的观测值
% 初始参数估计
p0 = [1, 0]; % 初始参数
% 使用lsqnonlin函数求解最小二乘问题
options = optimoptions('lsqnonlin', 'Display', 'iter');
p_opt = lsqnonlin(@(p) objective(p, x, y), p0, [], [], options);
% 输出最优参数估计
fprintf('最优参数估计:p1 = %.4f, p2 = %.4f\n', p_opt(1), p_opt(2));
% 绘制拟合曲线
y_opt = nonlinearModel(x, p_opt); % 最优参数下的模型值
plot(x, y, 'o', x, y_true, 'k-', x, y_opt, 'r-');
legend('观测值', '真实曲线', '拟合曲线');
xlabel('x');
ylabel('y');
grid on;
```
在这段代码中,首先定义了非线性模型函数`nonlinearModel`,然后定义了目标函数`objective`,该函数描述了观测值与模型值之间的残差。然后,生成了观测数据`x`和`y`,以及真实参数`p_true`。接下来,使用初始参数估计`p0`和`lsqnonlin`函数来求解最小二乘问题,并输出最优参数估计。最后,绘制了观测数据、真实曲线和拟合曲线的图像。