matlab最小二乘求解方程
<!--一个博主专栏付费入口结束-->
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-d284373521.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<p>1.约束线性最小二乘</p>
有约束线性最小二乘的标准形式为
sub.to
其中:C、A、Aeq 为矩阵;d、b、beq、lb、ub、x 是向量。
在MATLAB5.x 中,约束线性最小二乘用函数conls 求解。
函数 lsqlin
格式 x = lsqlin(C,d,A,b) %求在约束条件 下,方程Cx = d 的最小二乘解
x。
x = lsqlin(C,d,A,b,Aeq,beq) %Aeq、beq 满足等式约束 ,若没有不等式约
束,则设A=[ ],b=[ ]。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub) %lb、ub 满足 ,若没有等式约束,则
Aeq=[ ],beq=[ ]。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0) % x0 为初始解向量,若x 没有界,
则lb=[ ],ub=[ ]。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options) % options 为指定优化参
数
[x,resnorm] = lsqlin(…) % resnorm=norm(C*x-d)^2,即2-范数。
[x,resnorm,residual] = lsqlin(…) %residual=C*x-d,即残差。
[x,resnorm,residual,exitflag] = lsqlin(…) %exitflag 为终止迭代的条
件
[x,resnorm,residual,exitflag,output] = lsqlin(…) % output 表示输出
优化信息
[x,resnorm,residual,exitflag,output,lambda] = lsqlin(…) % lambda 为
解x 的Lagrange 乘子
例5-15 求解下面系统的最小二乘解
系统:Cx=d
约束: ;
先输入系统系数和x 的上下界:
C = [0.9501 0.7620 0.6153 0.4057;
0.2311 0.4564 0.7919 0.9354;
0.6068 0.0185 0.9218 0.9169;
0.4859 0.8214 0.7382 0.4102;
0.8912 0.4447 0.1762 0.8936];
d = [ 0.0578; 0.3528; 0.8131; 0.0098; 0.1388];
A =[ 0.2027 0.2721 0.7467 0.4659;
0.1987 0.1988 0.4450 0.4186;
0.6037 0.0152 0.9318 0.8462];
b =[ 0.5251; 0.2026; 0.6721];
lb = -0.1*ones(4,1);
ub = 2*ones(4,1);
然后调用最小二乘命令:
[x,resnorm,residual,exitflag,output,lambda] =
lsqlin(C,d,A,b,[ ],[ ],lb,ub);
结果为:
x =
-0.1000
-0.1000
0.2152
0.3502
resnorm =
0.1672
residual =
0.0455
0.0764
-0.3562
0.1620
0.0784
exitflag =
1 %说明解x 是收敛的
output =
iterations: 4
algorithm: medium-scale: active-set
firstorderopt: []
cgiterations: []
lambda =
lower: [4x1 double]
upper: [4x1 double]
eqlin: [0x1 double]
ineqlin: [3x1 double]
通过lambda.ineqlin 可查看非线性不等式约束是否有效。
2.非线性数据(曲线)拟合
非线性曲线拟合是已知输入向量xdata 和输出向量ydata,并且知道输入与输出
的函数关系为ydata=F(x, xdata),但不知道系数向量x。今进行曲线拟合,求
x 使得下式成立:
在MATLAB5.x 中,使用函数curvefit 解决这类问题。
函数 lsqcurvefit
格式 x = lsqcurvefit(fun,x0,xdata,ydata)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
[x,resnorm] = lsqcurvefit(…)
[x,resnorm,residual] = lsqcurvefit(…)
[x,resnorm,residual,exitflag] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqcurvefit(…)
参数说明:
x0 为初始解向量;xdata,ydata 为满足关系ydata=F(x, xdata)的数据;
lb、ub 为解向量的下界和上界 ,若没有指定界,则lb=[ ],ub=[ ];
options 为指定的优化参数;
fun 为拟合函数,其定义方式为:x = lsqcurvefit(@myfun,x0,xdata,ydata),
其中myfun 已定义为 function F = myfun(x,xdata)
F = … % 计算x 处拟合函数值fun 的用法与前面相同;
resnorm=sum ((fun(x,xdata)-ydata).^2),即在x 处残差的平方和;
residual=fun(x,xdata)-ydata,即在x 处的残差;
exitflag 为终止迭代的条件;
output 为输出的优化信息;
lambda 为解x 处的Lagrange 乘子;
jacobian 为解x 处拟合函数fun 的jacobian 矩阵。
例5-16 求解如下最小二乘非线性拟合问题
已知输入向量xdata 和输出向量ydata,且长度都是n,拟合函数为
即目标函数为
其中:
初始解向量为x0=[0.3, 0.4, 0.1]。
解:先建立拟合函数文件,并保存为myfun.m
function F = myfun(x,xdata)
F = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;
然后给出数据xdata 和ydata
xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
x0 = [10, 10, 10]; %初始估计值
[x,resnorm] = lsqcurvefit(@myfun,x0,xdata,ydata)
结果为:
Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun
x =
0.2269 0.3385 0.3021
resnorm =
6.2950
3.非线性最小二乘
非线性最小二乘(非线性数据拟合)的标准形式为
其中:L 为常数在MATLAB5.x 中,用函数leastsq 解决这类问题,在6.0 版中使用函数lsqnonlin。
设
则目标函数可表达为
其中:x 为向量,F(x)为函数向量。
函数 lsqnonlin
格式 x = lsqnonlin(fun,x0) %x0 为初始解向量;fun 为 ,i=1,2,…,m,fun
返回向量值F,而不是平方和值,平方和隐含在算法中,fun 的定义与前面相同。
x = lsqnonlin(fun,x0,lb,ub) %lb、ub 定义x 的下界和上界: 。
x = lsqnonlin(fun,x0,lb,ub,options) %options 为指定优化参数,若x 没
有界,则lb=[ ],ub=[ ]。
[x,resnorm] = lsqnonlin(…) % resnorm=sum(fun(x).^2),即解x 处目标
函数值。
[x,resnorm,residual] = lsqnonlin(…) % residual=fun(x),即解x 处fun
的值。
[x,resnorm,residual,exitflag] = lsqnonlin(…) %exitflag 为终止迭代
条件。
[x,resnorm,residual,exitflag,output] = lsqnonlin(…) %output 输出优
化信息。
[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(…) %lambda
为Lagrage 乘子。
[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqnonlin(…)
%fun 在解x 处的Jacobian 矩阵。
例5-17 求下面非线性最小二乘问题 初始解向量为x0=[0.3, 0.4]。
解:先建立函数文件,并保存为myfun.m,由于lsqnonlin 中的fun 为向量形式
而不是平方和形式,因此,myfun 函数应由 建立:
k=1,2,…,10
function F = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));
然后调用优化程序:
x0 = [0.3 0.4];
[x,resnorm] = lsqnonlin(@myfun,x0)
结果为:
Optimization terminated successfully:
Norm of the current step is less than OPTIONS.TolX
x =
0.2578 0.2578
resnorm = %求目标函数值
124.3622
4.非负线性最小二乘
非负线性最小二乘的标准形式为:
sub.to
其中:矩阵C 和向量d 为目标函数的系数,向量x 为非负独立变量。
在MATLAB5.x 中,用函数nnls 求解这类问题,在6.0 版中则用函数lsqnonneg。
函数 lsqnonneg
格式 x = lsqnonneg(C,d) %C 为实矩阵,d 为实向量
x = lsqnonneg(C,d,x0) % x0 为初始值且大于0
x = lsqnonneg(C,d,x0,options) % options 为指定优化参数
[x,resnorm] = lsqnonneg(…) % resnorm=norm (C*x-d)^2
[x,resnorm,residual] = lsqnonneg(…) %residual=C*x-d
[x,resnorm,residual,exitflag] = lsqnonneg(…)
[x,resnorm,residual,exitflag,output] = lsqnonneg(…)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(…)
例5-18 一个最小二乘问题的无约束与非负约束解法的比较。
先输入数据:
C = [ 0.0372 0.2869; 0.6861 0.7071; 0.6233 0.6245; 0.6344 0.6170];
d = [0.8587; 0.1781; 0.0747; 0.8405];
[C\d, lsqnonneg(C,d)]
ans =
-2.5627 0
3.1108 0.6929
注意:1。当问题为无约束线性最小二乘问题时,使用MATLAB 下的“\”运算即
可以解决。2.对于非负最小二乘问题,调用lsqnonneg(C,d)求解。
上一篇: Eigen 线性问题求解(最小二乘等)
下一篇: 算法与数据结构体系课