【最优化方法】实验一 熟悉MATLAB基本功能

实验一  熟悉MATLAB基本功能

实验的目的和要求:在本次实验中,通过亲临使用MATLAB,对该软件做一全面了解并掌握重点内容。

实验内容:

1、全面了解MATLAB系统

2、实验常用工具的具体操作和功能

学习建议:

本次实验在全面了解软件系统基础之上,学习和熟悉一些MATLAB的基础用途,重点掌握优化工具箱函数选用的内容。

重点和难点:

优化工具箱函数选用。

利用Matlab的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程(组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。

优化工具箱中的函数

优化工具箱中的函数包括下面几类:

1**.最小化函数**

表1 最小化函数表

fgoalattain 多目标达到问题
fminbnd 有边界的标量非线性最小化
fmincon 有约束的非线性最小化
fminimax 最大最小化
fminsearch, fminunc 无约束非线性最小化
fseminf 半无限问题
linprog 线性课题
quadprog 二次课题

2**.方程求解函数**

表2 方程求解函数表

/ 线性方程求解
fsolve 非线性方程求解
fzero 标量非线性方程求解

3**.最小二乘(曲线拟合)函数**

表3 最小二乘函数表

/ 线性最小二乘
lsqlin 有约束线性最小二乘
lsqcurvefit 非线性曲线拟合
lsqnonlin 非线性最小二乘
lsqnonneg 非负线性最小二乘

4**.实用函数**

表4 实用函数表

optimset 设置参数
optimget

5**.大型方法的演示函数**

表5 大型方法的演示函数表

circustent 马戏团帐篷问题---二次课题
molecule 用无约束非线性最小化进行分子组成求解
optdeblur 用有边界线性最小二乘法进行图形处理

6**.中型方法的演示函数**

表6 中型方法的演示函数表

bandemo 香蕉函数的最小化
dfildemo 过滤器设计的有限精度
goaldemo 目标达到举例
optdemo 演示过程菜单
tutdemo 教程演示

下面以我们最常用的线性规划模型求解函数linprog作为典型对优化工具箱进行简单的介绍。

linprog函数

功能:求解线性规划问题。

在命令窗口,键入doc linprog,得到下图(该图为帮助窗口)

数学模型

其中f , x , b , beq , lbub 为向量,AAeq为矩阵。

语法

matlab 复制代码
x = linprog(f,A,b,Aeq,beq)

x = linprog(f,A,b,Aeq,beq,lb,ub)

x = linprog(f,A,b,Aeq,beq,lb,ub,x0)

x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)

[x,fval] = linprog(...)

[x,fval,exitflag] = linprog(...)

[x,fval,exitflag,output] = linprog(...)

[x,fval,exitflag,output,lambda] = linprog(...)

描述

x = linprog(f,A,b)求解问题 min f'x,约束条件为Ax <= b。

x = linprog(f,A,b,Aeq,beq)求解上面的问题,但增加等式约束,即Aeq*x = beq。若没有不等式存在,则令A=[]、b=[]。

x = linprog(f,A,b,Aeq,beq,lb,ub)定义设计变量x的下界lb和上界ub,使得x始终在该范围内。若没有等式约束,令Aeq=[]、beq=[]。

x = linprog(f,A,b,Aeq,beq,lb,ub,x0)设置初值为x0。该选项只适用于中型问题,缺省时大型算法将忽略初值。

x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)用options指定的优化参数进行最小化。

[x,fval] = linprog(...) 返回解x处的目标函数值fval。

[x,lambda,exitflag] = linprog(...)返回exitflag值,描述函数计算的退出条件。

[x,lambda,exitflag,output] = linprog(...) 返回包含优化信息的输出变量output。

[x,fval,exitflag,output,lambda] = linprog(...) 将解x处的拉格朗日乘子返回到lambda参数中。

变量

lambda参数

lambda参数是解x处的拉格朗日乘子。它有以下一些属性:

 lambda.lower --lambda的下界。

 lambda.upper --lambda的上界。

 lambda.ineqlin --lambda的线性不等式。

 lambda.eqlin --lambda的线性等式。

其它参数意义同前。

算法

大型优化算法 大型优化算法采用的是LIPSOL法,该法在进行迭代计算之前首先要进行一系列的预处理。

中型优化算法 linprog函数使用的是投影法,就象quadprog函数的算法一样。linprog函数使用的是一种活动集方法,是线性规划中单纯形法的变种。它通过求解另一个线性规划问题来找到初始可行解。

诊断

大型优化问题 算法的第一步涉及到一些约束条件的预处理问题。有些问题可能导致linprog函数退出,并显示不可行的信息。在本例中,exitflag参数将被设为负值以表示优化失败。

若Aeq参数中某行的所有元素都为零,但Beq参数中对应的元素不为零,则显示以下退出信息:

Exiting due to infeasibility: an all zero row in the constraint matrix does not have a zero in corresponding right hand size entry.

若x的某一个元素没在界内,则给出以下退出信息:

Exiting due to infeasibility: objective f'*x is unbounded below.

若Aeq参数的某一行中只有一个非零值,则x中的相关值称为奇异变量。这里,x中该成分的值可以用Aeq和Beq算得。若算得的值与另一个约束条件相矛盾,则给出以下退出信息:

Exiting due to infeasibility: Singleton variables in equality constraints are not feasible.

若奇异变量可以求解但其解超出上界或下界,则给出以下退出信息:

Exiting due to infeasibility: singleton variables in the equality constraints are not within bounds.

应用实例

这是matlab帮助窗口里给出的一个例子:

matlab 复制代码
Find x that minimizes 

f(x) = --5x1 -- 4x2 --6x3,

subject to

x1 -- x2 + x3 ≤ 20

3x1 + 2x2 + 4x3 ≤ 42

3x1 + 2x2 ≤ 30

0 ≤ x1, 0 ≤ x2, 0 ≤ x3.

First, enter the coefficients

f = [-5; -4; -6];

A = [1 -1 1

   3 2 4

   3 2 0];

b = [20; 42; 30];

lb = zeros(3,1);

Next, call a linear programming routine.

[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);

Examine the solution and Lagrange multipliers:

x,lambda.ineqlin,lambda.lower

x = 

   0.0000

  15.0000

   3.0000

ans =

   0.0000

   1.5000

   0.5000

ans =

   1.0000

   0.0000

   0.0000

下面在来用linprog解我们最优化考试的题:

matlab 复制代码
Min f(x)=-3x1 + x2 + x3;

S.T. x1 -- 2*x2 + x3<=11

   -4*x1 + x2 + 2*x3 -- x4=3

   -2*x1 + x3=1

   X1,x2,x3,x4>=0 ;

在matlab command window中键入以下指令:

f=[-3;1;1];

\>> A=[1 -2 1;4 -1 -2];

\>> b=[11;-3];

\>> Aeq=[-2 0 1];

\>> beq=1;

\>> lb=zeros(3,1);

\>> [x,fval,exitflag]=linprog(f,A,b,Aeq,beq,lb)

Optimization terminated.

x =

  4.0000

  1.0000

  9.0000

fval =

  -2.0000

exitflag =

   1
相关推荐
如影随从5 分钟前
04-ArcGIS For JavaScript的可视域分析功能
开发语言·javascript·arcgis·可视域分析
XiaoCCCcCCccCcccC9 分钟前
C语言实现双向链表
c语言·开发语言·链表
十年一梦实验室12 分钟前
【C++】相机标定源码笔记- RGB 相机与 ToF 深度传感器校准类
开发语言·c++·笔记·数码相机·计算机视觉
Tech Synapse17 分钟前
Java循环创建对象内存溢出怎么解决
java·开发语言·jvm
蜉蝣之翼❉22 分钟前
c++ 简单线程池
开发语言·c++
WHYBIGDATA33 分钟前
Scala中高级的函数编程
开发语言·后端·scala
知识分享小能手39 分钟前
从新手到高手:Scala函数式编程完全指南,Scala 访问修饰符(6)
大数据·开发语言·后端·python·数据分析·scala·函数式编程
点云侠1 小时前
matlab 干涉图仿真
开发语言·人工智能·算法·计算机视觉·matlab
2401_858425551 小时前
Batch文件中使用tasklist命令:深入掌握进程监控与分析
开发语言·batch
Eiceblue1 小时前
用Python轻松转换Markdown文件为PDF文档
开发语言·vscode·python·pdf·word