目录
想查找相关内容也可在页面按ctrl+F搜索文字
一、线性规划
线性规划模型如下:
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])
%输出
已锁定最新绘图