最小二乘最优问题(转)默认分类2009-05-21 14:56:33 阅读62 评论1 字号:大中小1.约束线性最小二乘有约束线性最小二乘的标准形式为sub.to其中:C、A、Aeq 为矩阵;d、b、beq、lb、ub、x 是向量。
在MA TLAB5.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.10000.21520.3502resnorm =0.1672residual =0.04550.0764-0.35620.16200.0784exitflag =1 %说明解x 是收敛的output =iterations: 4algorithm: 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 使得下式成立:在MA TLAB5.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,re snorm] = 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,exitfla g,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.mfunction 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.TolFunx =0.2269 0.3385 0.3021resnorm =6.29503.非线性最小二乘非线性最小二乘(非线性数据拟合)的标准形式为其中:L 为常数在MA TLAB5.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,…,10function 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.TolXx =0.2578 0.2578resnorm = %求目标函数值124.36224.非负线性最小二乘非负线性最小二乘的标准形式为:sub.to其中:矩阵C 和向量d 为目标函数的系数,向量x 为非负独立变量。
在MA TLAB5.x 中,用函数nnls 求解这类问题,在6.0 版中则用函数lsqnonneg。