Matlab求解优化问题(规划问题、插值与拟合)

目录

想查找相关内容也可在页面按ctrl+F搜索文字

一、线性规划

二、非线性规划

三、插值与拟合

1.拟合

1)最小二乘曲线拟合

2)非线性最小二乘拟合

2.插值

1)一维插值指令

2)二维插值指令


一、线性规划

线性规划模型如下:

Matlab中求解线性规划的指令:

[x,fval,exitflag,output,lambda] =linprog(c,A,b,Aeq,beq,lb,ub,x0,options)

  • x:返回的最优解
  • fval:返回最优值
  • exitflag结束标志:">0"表示解是收敛的;"=0"表示因到达最大迭代次数而结束;"<0"表示解不收敛!
  • output结构变量:返回迭代次数、优化算法等信息。
  • lambda结构变量:返回Lagrange乘子信息

不需要某项输入参数时,可用空方括号[]占据其原有位置。如果末几位都缺省,可以缩短括号

示例:

c = [-5, -4, -6];
A =  [1 -1  1
      3  2  4
      3  2  0];
b = [20; 42; 30];
lb = zeros(3,1);   %下限
[x,fval,exitflag,output,lambda] = linprog(c,A,b,[],[],lb)
%输出
x =

         0
   15.0000
    3.0000


fval =

   -78


exitflag =

     1


output = 

  包含以下字段的 struct:

         iterations: 3
    constrviolation: 0
            message: 'Optimal solution found.'
          algorithm: 'dual-simplex'
      firstorderopt: 1.7764e-15


lambda = 

  包含以下字段的 struct:

      lower: [3×1 double]
      upper: [3×1 double]
      eqlin: []
    ineqlin: [3×1 double]

二、非线性规划

非线性规划的模型如下:

Matlab中求解非线性规划的指令:a

[x,fval,exitflag,output,lambda,grad,hessian] =fmincon('fun',x0,A,b,Aeq,beq,lb,ub,'nonlcon',options,P1,P2, ...)

  • 其中nonlcon为非线性约束及导数:[C,Ceq,gC,gCeq]=nonlcon(x);
  • 而fun则为目标函数及导数和Hess矩阵: [f,g,H] = myfun(x);
  • fval:返回最优目标值。

输入空矩阵[ ]则表示该项不需要输入或用缺省值。

示例:

%函数编辑窗内输入非线性约束
function [c,ceq] = mycon(x)
c1=1.5+x(1)*x(2)-x(1)-x(2);
c2=-x(1)*x(2)-10;
c=[c1;c2];       % 非线性不等式约束
ceq = [];        % 非线性等式约束
%指令窗
optf=@(x) exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);  %目标函数
x0=[10;10];   %x0可根据经验和实际情况自定义
lb=[0;0];
ub=[inf;inf];
options = optimset('Algorithm','active-set','Display','off');
[x,fval] = fmincon(optf,x0,[],[],[],[],lb,ub,@mycon, options)
%输出
x =

         0
    1.5000


fval =

    8.5000

三、插值与拟合

1.拟合

1)最小二乘曲线拟合

[a,SS,Re]=lsqcurvefit(fun,a0,x,y)

功能:拟合一元函数f(x)。  

说明:

  • a:系数向量
  • Re:残差
  • SS:残差平方和
  • fun:表示f(x) 的Matlab函数(第一输入参数表示待估参数向量,第二输入参数表示函数的自变量x)
  • x、y:表示已收集的配对数据。

曲线拟合示例:从正弦线上测量到一批数据点,用函数y=a*cos(b*x+c)+d去拟合这批数据,确定出待估计参数a、b、c、d

x=0:.1:5;
y=sin(x);  % 模拟测量数据
f=@(b,x)  b(1)*cos(b(2)*x+b(3))+b(4)
[a,ss]=lsqcurvefit(f,[1,1,1,1],x,y)
xf=0:0.05:8;
yfit=f(a,xf);
plot(xf,sin(xf),'ro',xf,yfit,'b-')
%输出
f =

  包含以下值的 function_handle:

    @(b,x)b(1)*cos(b(2)*x+b(3))+b(4)


Local minimum found.

Optimization completed because the size of the gradient is less than
the default value of the optimality tolerance.

<stopping criteria details>


a =

   -1.0000    1.0000    1.5708   -0.0000


ss =

   8.9790e-29

2)非线性最小二乘拟合

[a,Re,Jacobian] = nlinfit(X,y,fun, a0)

功能:拟合多元函数f(x)

说明:

  • a:系数向量
  • Re:残差
  • Jacobian:Jacobian矩阵。
  • X,y:均为已收集到的配对数据
  • fun:表示多元函数f(x) 的Matlab函数(第一输入参数表示待估参数向量,第二输入参数表示多元自变量取值的X矩阵)
  • X的每一行是对应一个因变量y取值的各自变量取值

曲面拟合示例:假定二元函数z=f(x,y)=x^2+y^2-1的系数不知道,只知道z=ax^2+by^2+c 但是知道z=f(x,y)上的一批点坐标

zf=@(a,x) a(1)*x(:,1).^2+a(2)*x(:,2).^2+a(3) %构造拟合函数类型
%下面模拟测量到一批点:
[X0,Y0]=meshgrid(-2:.2:2);
x0=X0(:);
y0=Y0(:);
z0=zf([1,1,-1],[x0,y0]);
%用上面的点去拟合估计曲面函数中的参数a:
[b,re]=nlinfit([x0,y0],z0,zf,[0,0,0]);
b %显示b,发现恰好是1、1、-1

%输出
zf =

  包含以下值的 function_handle:

    @(a,x)a(1)*x(:,1).^2+a(2)*x(:,2).^2+a(3)


b =

    1.0000    1.0000   -1.0000

2.插值

1)一维插值指令

yi=interp1(X,Y,xi,method)

yi=interp1(X,Y,xi,method,'extrap')

yi=interp1(X,Y,xi,method,extrapval)

  • 'extrap':当xi超过X的范围时,执行外插算法;
  • extrapval:一般取0或nan,表示当xi超过范围时,外插值取extrapval;
  • method:可取'nearest', 'linear'(快速连接),'cubic','spline'(追求光滑)等,指示函数在相邻已知点间如何取值;
  • X,Y:已知数据点的坐标;
  • xi:需计算插值的点。

2)二维插值指令

ZI = interp2(X,Y,Z,XI,YI,'method')

示例:网格插值 peaks 函数

[X,Y] = meshgrid(-3:.25:3);
Z = peaks(X,Y);
[XI,YI] = meshgrid(-3:.125:3);
ZI = interp2(X,Y,Z,XI,YI);
%surf(X,Y,Z)
mesh(X,Y,Z), hold, 
mesh(XI,YI,ZI+15), hold off
axis([-3 3 -3 3 -5 20])
%输出
已锁定最新绘图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值