使用 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]

相关推荐
通信仿真实验室4 小时前
(10)MATLAB莱斯(Rician)衰落信道仿真1
开发语言·matlab
jk_10114 小时前
MATLAB中decomposition函数用法
开发语言·算法·matlab
不想当个技术宅17 小时前
【梯级水电站调度优化】基于自适应权值优化粒子群算法
matlab·粒子群算法·梯级水电站调度优化
蓝色洛特18 小时前
【Matlab元胞自动机】《高速公路人工—自动驾驶混行交通流临界特征研究》
matlab·自动驾驶·元胞自动机·交通仿真
quaer19 小时前
Open-Sora全面开源?
开发语言·算法·机器学习·matlab·矩阵
吱吱鼠叔1 天前
MATLAB计算与建模常见函数:5.曲线拟合
算法·机器学习·matlab
吱吱鼠叔2 天前
MATLAB数据文件读写:2.矩阵数据读取
数据库·matlab·矩阵
橙意满满的西瓜大侠2 天前
matlab入门学习(二)矩阵、字符串、基本语句、函数
matlab
kuan_li_lyg2 天前
MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态
开发语言·人工智能·matlab·机器人·ros·机械臂·手眼标定
感谢地心引力2 天前
【MATLAB2024b】安装离线帮助文档(windows)
windows·matlab