使用 matlab 求解最小二乘问题

有约束线性最小二乘

其标准形式为:
min ⁡ x 1 2 ∥ C x − d ∥ 2 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| Cx-d \right\|_2^2 xmin21∥Cx−d∥22

约束条件为:
A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b \begin{aligned} A \cdot x & \le b \\ A_{eq} \cdot x & = b_{eq} \\ lb \le & x \le ub \end{aligned} A⋅xAeq⋅xlb≤≤b=beqx≤ub

matlab 使用 lsqlin 求解该类型问题,调用格式如下
x = lsqlin(C, d, A, B, Aeq, Beq, lb, ub, x0)
[x, resnorm, residual] = lsqlin(C, d, A, B, Aeq, Beq, lb, ub, x0)

没有的约束设置为 [] 就行,x0 是初始解向量,比如说你知道解大概是多少,设了可以避免陷入局部最优,减少优化时间等,没有可以不加或者设置为 []。resnorm就是 ∥ C x − d ∥ 2 2 \left\| Cx-d \right\|_2^2 ∥Cx−d∥22,residual就是 C x − d Cx-d Cx−d.

假设已知有一个函数为:
y = a 1 × x + a 2 × x + a 3 × x 0.8 + a 4 y = a_1 \times x + a_2 \times \sqrt{x} + a_3 \times x^{0.8} + a_4 y=a1×x+a2×x +a3×x0.8+a4

其中 a 1 = 1 , a 2 = 2 , a 3 = − 3 , a 4 = 4 a_1 = 1, a_2 = 2, a_3 = -3, a_4 = 4 a1=1,a2=2,a3=−3,a4=4,另外在 y y y中添加了噪声 n o i s e noise noise,如何用有噪声的数据将参数求出来。

噪声数据如图

仿真如下:

matlab 复制代码
% created by hyacinth on 2024/1/8
clc
clear
close all

%%
x1 = 1:100;
x2 = x1.^0.5;
x3 = x1.^0.8;
x4 = ones(size(x1));

y = x1 + 2*x2 - 3*x3 + 4*x4;
yn = y + 0.05*randn(size(x1));

C = [x1',x2',x3',x4'];
d = yn';
theta = lsqlin(C,d);

因为题目是我瞎编的,没加什么约束,实际中有约束加上去就行了,比如说约束上下界 l b = − 10 , u b = 10 lb = -10, ub =10 lb=−10,ub=10。

matlab 复制代码
lb = -10*ones(1,4);
ub = 10*ones(1,4);
theta = lsqlin(C,d,[],[],[],[],lb,ub);

这样设置就行了,最后求出来的系数为:
t h e t a = [ 1.0106 ; 2.0880 ; − 3.0468 ; 3.9113 ] theta = [1.0106; 2.0880; -3.0468; 3.9113] theta=[1.0106;2.0880;−3.0468;3.9113]

非线性曲线拟合

跟上面很像,比如说知道输入输出函数关系,但是不知道系数向量,就可以进行曲线拟合。
min ⁡ x 1 2 ∥ F ( x , x d a t a ) − y d a t a ∥ 2 2 = 1 2 ∑ i ( F ( x , x d a t a i ) − y d a t a i ) 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| F(x, x_{data})-y_{data} \right\|2^2 = \frac{1}{2}\sum\limits_i \left(F(x, x{data_i})-y_{data_i} \right)^2 xmin21∥F(x,xdata)−ydata∥22=21i∑(F(x,xdatai)−ydatai)2

matlab 调用函数如下:
[x, resnorm] = lsqcurvefit(fun, x0, xdata, ydata,lb,ub)

以x0作为初始解,求取合适的系数,使得非线性函数fun满足最佳拟合。lb,ub是系数的边界约束条件,没有就不加。resnorm就是 ∥ F ( x , x d a t a ) − y d a t a ∥ 2 2 \left\| F(x, x_{data})-y_{data} \right\|_2^2 ∥F(x,xdata)−ydata∥22的值。

还是一样,比如说要拟合曲线
y = a 1 × x + a 2 × x + a 3 × x 0.8 + a 4 y = a_1 \times x + a_2 \times \sqrt{x} + a_3 \times x^{0.8} + a_4 y=a1×x+a2×x +a3×x0.8+a4

先建立函数

matlab 复制代码
function y = myfun(a,xdata)
y = a(1)*xdata + a(2)*sqrt(xdata) + a(3)*xdata.^0.8 + a(4);

拟合

matlab 复制代码
% created by hyacinth on 2024/1/8
clc
clear
close all

%%
x1 = 1:100;
x2 = x1.^0.5;
x3 = x1.^0.8;
x4 = ones(size(x1));

y = x1 + 2*x2 - 3*x3 + 4*x4;
yn = y + 0.05*randn(size(x1));

x0 = [1,1,1,1];
a = lsqcurvefit(@myfun,x0,x1,yn);

最后的解为
a = [ 0.9969 , 1.9763 , − 2.9865 , 4.0131 ] a = [0.9969, 1.9763, -2.9865, 4.0131] a=[0.9969,1.9763,−2.9865,4.0131]

非负线性最小二乘

min ⁡ x 1 2 ∥ C x − d ∥ 2 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| Cx-d \right\|_2^2 xmin21∥Cx−d∥22

约束条件为:
x ≥ 0 x \ge 0 x≥0

matlab 调用函数如下:
x = lsqnonneg(C, d)
[x, resnorm, residual] = lsqnonneg(C, d)

其中resnorm就是 ∥ C x − d ∥ 2 2 \left\| Cx-d \right\|_2^2 ∥Cx−d∥22,residual就是 C x − d Cx-d Cx−d.

比如说将上面的函数改为
y = a 1 × x + a 2 × x + a 3 × x 0.8 + a 4 y = a_1 \times x + a_2 \times \sqrt{x} + a_3 \times x^{0.8} + a_4 y=a1×x+a2×x +a3×x0.8+a4

其中 a 1 = 1 , a 2 = 2 , a 3 = 3 , a 4 = 4 a_1 = 1, a_2 = 2, a_3 = 3, a_4 = 4 a1=1,a2=2,a3=3,a4=4,使用有噪声的数据求参数。

matlab 复制代码
% created by hyacinth on 2024/1/8
clc
clear
close all

%%
x1 = 1:100;
x2 = x1.^0.5;
x3 = x1.^0.8;
x4 = ones(size(x1));

y = x1 + 2*x2 + 3*x3 + 4*x4;
yn = y + 0.05*randn(size(x1));

C = [x1',x2',x3',x4'];
d = yn';
theta = lsqnonneg(C,d);

最后的结果为:
t h e t a = [ 0.9918 ; 1.9662 ; 3.0294 ; 3.9876 ] theta = [0.9918; 1.9662; 3.0294; 3.9876] theta=[0.9918;1.9662;3.0294;3.9876]

相关推荐
551只玄猫8 小时前
【数学建模 matlab 实验报告1】
开发语言·数学建模·matlab·课程设计·实验报告
机器学习之心11 小时前
扩散模型(Diffusion Model)数据生成+BP神经网络回归预测,Matlab完整代码
神经网络·matlab·回归·扩散模型·bp神经网络回归预测
bu_shuo16 小时前
MATLAB图片的所有导出格式
开发语言·matlab·图片
极创信息16 小时前
企业信创产品认证全流程:从信创适配到信创认证的实操指南(2026版)
java·数据库·spring boot·mysql·matlab·mybatis·软件工程
机器学习之心17 小时前
【DOA估计】基于MLE的无网格波达方向估计(结构化协方差恢复与SBL网格细化)附MATLAB代码
matlab·doa估计
飞舞哲18 小时前
漂浮基空间3自由度机械臂PD控制仿真
matlab·机器人·漂浮基
551只玄猫20 小时前
【数学建模 matlab 实验报告3】
开发语言·数学建模·matlab·课程设计·实验报告
551只玄猫20 小时前
【数学建模 matlab 实验报告2】
开发语言·数学建模·matlab·课程设计·实验报告
yong99902 天前
带挂载的四轴飞行器模型预测控制(MPC) MATLAB实现
开发语言·matlab
yongui478342 天前
MATLAB小波变换图像融合
opencv·计算机视觉·matlab