⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5.txt

📁 这是一些关于学习matlab 的资料
💻 TXT
📖 第 1 页 / 共 3 页
字号:
attainfactor为解x处的目标规划因子;
exitflag为终止迭代的条件;
output为输出的优化信息;
lambda为解x处的Lagrange乘子
例5-14    控制系统输出反馈器设计。
设如下线性系统
 
 
其中:             
要求设计输出反馈控制器K,使闭环系统
 
 
在复平面实轴上点[-5,-3,-1]的左侧有极点,并要求  
解:上述问题就是要求解矩阵K,使矩阵(A+BKC)的极点为[-5,-3,-1],这是一个多目标规划问题。
先建立目标函数文件,保存为eigfun.m:
function F = eigfun(K,A,B,C)
F = sort(eig(A+B*K*C));    % 估计目标函数值
然后,输入参数并调用优化程序:
A = [-0.5 0 0; 0 -2 10; 0 1 -2];
B = [1 0; -2 2; 0 1];
C = [1 0 0; 0 0 1]; 
K0 = [-1 -1; -1 -1];       % 初始化控制器矩阵
goal = [-5 -3 -1];         % 为闭合环路的特征值(极点)设置目标值向量
weight = abs(goal)        % 设置权值向量
lb = -4*ones(size(K0));    % 设置控制器的下界
ub = 4*ones(size(K0));     % 设置控制器的上界
options = optimset('Display','iter');   % 设置显示参数:显示每次迭代的输出
[K,fval,attainfactor] = fgoalattain(@eigfun,K0,goal,weight,[],[],[],[],lb,ub,[],options,A,B,C)
结果为:
weight =
     5     3     1
                    Attainment                  Directional 
 Iter   F-count       factor         Step-size     derivative      Procedure 
    1      6          1.885            1            1.03     
    2     13          1.061            1          -0.679     
    3     20         0.4211            1          -0.523    Hessian modified  
    4     27       -0.06352            1          -0.053    Hessian modified twice  
    5     34        -0.1571            1          -0.133     
    6     41        -0.3489            1        -0.00768    Hessian modified  
    7     48        -0.3643            1      -4.25e-005    Hessian modified  
    8     55        -0.3645            1        -0.00303    Hessian modified twice  
    9     62        -0.3674            1         -0.0213    Hessian modified  
   10     69        -0.3806            1        0.00266     
   11     76        -0.3862            1      -2.73e-005    Hessian modified twice  
   12     83        -0.3863            1      -1.22e-013    Hessian modified twice  
Optimization terminated successfully:
    Search direction less than 2*options. TolX and maximum constraint violation is less than options.TolCon
Active Constraints:
     1
     2
     4
     9
    10
K =
   -4.0000   -0.2564
   -4.0000   -4.0000
fval =
   -6.9313
   -4.1588
   -1.4099
attainfactor =
   -0.3863
5.7  最小二乘最优问题
5.7.1  约束线性最小二乘
有约束线性最小二乘的标准形式为
 
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可查看非线性不等式约束是否有效。
5.7.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
5.7.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
5.7.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)求解。
5.8  非线性方程(组)求解
5.8.1  非线性方程的解
非线性方程的标准形式为f(x)=0
函数  fzero
格式  x = fzero (fun,x0)   %用fun定义表达式f(x),x0为初始解。
x = fzero (fun,x0,options)
[x,fval] = fzero(…)     %fval=f(x)
[x,fval,exitflag] = fzero(…)
[x,fval,exitflag,output] = fzero(…)
说明  该函数采用数值解求方程f(x)=0的根。
例5-19  求 的根
解:>> fun='x^3-2*x-5';
>> z=fzero(fun,2)    %初始估计值为2
结果为
z =
       2.0946
5.8.2  非线性方程组的解
非线性方程组的标准形式为:F(x) = 0
其中:x为向量,F(x)为函数向量。
函数  fsolve
格式  x = fsolve(fun,x0)   %用fun定义向量函数,其定义方式为:先定义方程函数function F = myfun (x)。
F =[表达式1;表达式2;…表达式m]   %保存为myfun.m,并用下面方式调用:x = fsolve(@myfun,x0),x0为初始估计值。
x = fsolve(fun,x0,options)
[x,fval] = fsolve(…)     %fval=F(x),即函数值向量
[x,fval,exitflag] = fsolve(…)
[x,fval,exitflag,output] = fsolve(…)
[x,fval,exitflag,output,jacobian] = fsolve(…)   % jacobian为解x处的Jacobian阵。
其余参数与前面参数相似。
例5-20   求下列系统的根
 
解:化为标准形式
 
设初值点为x0=[-5  -5]。
先建立方程函数文件,并保存为myfun.m:
function F = myfun(x)
F = [2*x(1) - x(2) - exp(-x(1));
      -x(1) + 2*x(2) - exp(-x(2))];
然后调用优化程序
x0 = [-5; -5];           % 初始点
options=optimset('Display','iter');   % 显示输出信息
[x,fval] = fsolve(@myfun,x0,options) 
结果为
                                      Norm of    First-order 
Iteration   Func-count       f(x)         step        optimality   CG-iterations
    1          4        47071.2             1    2.29e+004        	0
    2          7        6527.47        1.45207    3.09e+003     	1
    3         10        918.372        1.49186          418    	1
    4         13         127.74        1.55326         57.3      	1
    5         16        14.9153        1.57591         8.26     	1
    6         19       0.779051        1.27662         1.14      	1
    7         22     0.00372453       0.484658       0.0683      	1
    8         25    9.21617e-008      0.0385552     0.000336      	1
    9         28    5.66133e-017    0.000193707    8.34e-009     	1
Optimization terminated successfully:
 Relative function value changing by less than OPTIONS.TolFun
x =
    0.5671
    0.5671
fval =
  1.0e-008 *
   -0.5320
   -0.5320
例5-21  求矩阵x使其满足方程 ,并设初始解向量为x=[1, 1; 1, 1]。
解:先编写M文件:
function F = myfun(x)
F = x*x*x-[1,2;3,4];
然后调用优化程序求解:
>>x0 = ones(2,2);     %初始解向量
>>options = optimset('Display','off');    %不显示优化信息
>>[x,Fval,exitflag] = fsolve(@myfun,x0,options)
则结果为
x =
   -0.1291    0.8602
    1.2903    1.1612
Fval =
  1.0e-003 *
    0.1541   -0.1163
    0.0109   -0.0243
exitflag =
     1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -