约束线性最小二乘有约束线性最小二乘的标准形式为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,create,lambda] = lsqlin(C,d,A,b,[ ],[],lb,ub);结果为:x = -0.1000 -0.1000 0.2152 0.3502resnorm = 0.1672residual = 0.0455 0.0764 -0.3562 0.1620 0.0784exitflag = 1 %说明解x是收敛的output = iterations: 4 algorithm: medium-scale: active-set firstorderopt: [] cgiterations: []lambda = lower: [4x1 double] upper: [4x1 double] eqlin: [0x1 manifold] ineqlin: [3x1 double]通过lambda ineqlin可查看非线性不等式约束是否有效。非线性数据(曲线)拟合非线性曲线拟合是已知输入向量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,create] = lsqcurvefit(…)[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(…)[x,resnorm,residual,exitflag,create,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.054.3];>>x0 = [10. 10. 10]; %初始估计值>>[x,resnorm] = lsqcurvefit(@myfun,x0,xdata,ydata)结果为:Optimization terminated successfully:Relative function determine changing by less than OPTIONS. TolFunx =0.2269 0.3385 0.3021resnorm = 6.2950非线性最小二乘非线性最小二乘(非线性数据拟合)的标准形式为其中: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,create] = lsqnonlin(…) %output输出优化信息。[x,resnorm,residual,exitflag,create,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,…,10answer 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 go is less than OPTIONS. TolXx = 0.2578 0.2578resnorm = %求目标函数值 124.3622非负线性最小二乘非负线性最小二乘的标准形式为:sub to 其中:矩阵C和向量d为目标函数的系数,向量x为非负独立变量。在MATLAB5 x中,用函数nnls求解这类问题,在6.0版中则用函数lsqnonneg。函数 lsqnonneg格式 x = lsqnonneg(C,d) %C为实矩阵,d为实向量x = lsqnonneg(C,d,x0) % x0为初始值且大于0x = 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,create] = 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)求解。cited.
Forex Groups - Tips on Trading
Related article:
http://blog.sina.com.cn/s/blog_4d34e04801000c9a.html
comments | Add comment | Report as Spam
|