Matlab fmincon函数用法

Matlab fmincon函数用法这个函数在之前优化工具箱一文中已经介绍过,由于其应用广泛,所以这里通过实例单独整理一下其用法。一、基本介绍求解问题的标准型为minF(X)s.tAX<=bAeqX=beqG(x)<=0Ceq(X)=0VLB<=X<=VUB其中X为n维变元向量,G(x)与Ceq(X)均为非线性函数组成的向量,其它变量的含…

大家好,又见面了,我是你们的朋友全栈君。

这个函数在之前优化工具箱一文中已经介绍过,由于其应用广泛,所以这里通过实例单独整理一下其用法。

一、基本介绍

求解问题的标准型为

min F(X)

s.t

AX <= b

AeqX = beq

G(x) <= 0

Ceq(X) = 0

VLB <= X <= VUB

 

其中X为n维变元向量,G(x)与Ceq(X)均为非线性函数组成的向量,其它变量的含义与线性规划,二次规划中相同,用Matlab求解上述问题,基本步骤分为三步:

1. 首先建立M文件fun.m定义目标函数F(X):

function f = fun(X);

f = F(X)

 

2. 若约束条件中有非线性约束:G(x) <= 0 或 Ceq(x) = 0,则建立M文件nonlcon.m定义函数G(X)和Ceq(X);

function [G, Ceq] = nonlcon(X)

G = …

Ceq = …

 

3. 建立主程序,非线性规划求解的函数时fmincon,命令的基本格式如下:

其形式如下:x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

求解问题的标准型为
min F(X)
s.t
AX <= b(线性不等式约束)
AeqX = beq(线性等式约束)
G(x) <= 0(非线性不等式约束)
Ceq(X) = 0(非线性等式约束)
lb <= X <= ub(变量约束)
————————————————

 

 

注意:

(1)fmincon函数提供了大型优化算法和中型优化算法。默认时,若在fun函数中提供了梯度(options 参数的GradObj设置为’on’),并且只有上下界存在或只有等式约束,fmincon函数将选择大型算法,当既有等式约束又有梯度约束时,使用中型算法。

(2)fmincon函数的中型算法使用的是序列二次规划法。在每一步迭代中 求解二次规划子问题,并用BFGS法更新拉格朗日Hessian矩阵。

(3)fmincon函数可能会给出局部最优解,这与初值X0的选取有关。

 

二、实例

1. 第一种方法,直接设置边界

主要是指直接设置A,b等参数。

例1:min f = -x1 – 2*x2 + 1/2*x1^2 + 1/2 * x2^2

2*x1 + 3*x2 <= 6

x1 + 4*x2 <= 5

x1, x2 >= 0

 

function ex131101

 

x0 = [1; 1];

A = [2, 3; 1, 4];

b = [6, 5];

Aeq = [];

beq = [];

VLB = [0; 0];

VUB = [];

[x, fval] = fmincon(@fun3, x0, A, b, Aeq, beq, VLB, VUB)

 

function f = fun3(x)

f = -x(1) – 2*x(2) + (1/2)*x(1)^2 + (1/2)*x(2)^2;

 

2. 第二种方法,通过函数设置边界

例2: min f(x) = exp(x1) * (4*x1^2 + 2*x2^2 + 4*x1*x2 + 2*x2 + 1)

x1 + x2 = 0

1.5 + x1 * x2 – x1 – x2  <= 0

-x1*x2 – 10 <= 0

function youh3

clc;

x0 = [-1, 1];

A = [];b = [];

Aeq = []; beq = [];

vlb = []; vub = [];

[x, fval] = fmincon(@fun4, x0, A, b, Aeq, beq, vlb, vub, @mycon)

 

function f = fun4(x);

f = exp(x(1)) * (4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);

 

function [g, ceq] = mycon(x)

g = [1.5 + x(1)*x(2) – x(1) – x(2); -x(1)*x(2) – 10];

ceq = [x(1) + x(2)];

 

3. 进阶用法,增加梯度以及传递参数

这里用无约束优化函数fminunc做示例,对于fmincon方法相同,只需将边界项设为空即可。

(1)定义目标函数

function [J, grad] = costFunction(theta, X, y)

%COSTFUNCTION Compute cost and gradient for logistic regression

%   J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the

%   parameter for logistic regression and the gradient of the cost

%   w.r.t. to the parameters.

 

% Initialize some useful values

m = length(y); % number of training examples

 

% You need to return the following variables correctly 

J = 0;

grad = zeros(size(theta));

 

% ====================== YOUR CODE HERE ======================

% Instructions: Compute the cost of a particular choice of theta.

%               You should set J to the cost.

%               Compute the partial derivatives and set grad to the partial

%               derivatives of the cost w.r.t. each parameter in theta

%

% Note: grad should have the same dimensions as theta

%

 

z = X * theta;

hx = 1 ./ (1 + exp(-z));

J = 1/m * sum([-y’ * log(hx) – (1 – y)’ * log(1 – hx)]);

 

for  j = 1: length(theta)

    grad(j) = 1/m * sum((hx – y)’ * X(:,j));

end

 

 

% =============================================================

 

end

 

(2)优化求极小值

%  Set options for fminunc

options = optimset(‘GradObj’, ‘on’, ‘MaxIter’, 400);

 

%  Run fminunc to obtain the optimal theta

%  This function will return theta and the cost 

[theta, cost] = …

    fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);

 

% [theta, cost] = …

%   fminunc(@(t)(costFunction(t, X, y)), initial_theta);

% Print theta to screen

fprintf(‘Cost at theta found by fminunc: %f\n’, cost);

fprintf(‘theta: \n’);

fprintf(‘ %f \n’, theta);

 http://blog.sina.com.cn/s/blog_84024a4a0101e1ym.html

 https://blog.csdn.net/qq_38784454/article/details/80329021

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132041.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【问题】Win10 system占用cpu资源高

    现象查看具体信息锁定目标:ACPI,跟系统中断有关电源管理,关闭PCIExpress

    2022年4月6日
    52
  • nema23_关于NEMA SM 23的说明

    nema23_关于NEMA SM 23的说明Unfortunately,NEMASM23isambiguousaboutthepointofresolutionofthecombinedforcesandmoments.Theresolutionpointshavebeeninterpretedtobethefollowingtwopoints:NEMASM23没有给出设备整体校核时所有作…

    2025年8月13日
    2
  • MySQL JDBC StreamResult通信原理浅析

    MySQL JDBC StreamResult通信原理浅析好几年没写技术博客了,今天写一个小的技术点给大家分享,关于MySQLJDBCStreamResult的原理分享,难度不大,就当程序员的闲聊。如果使用MySQLJDBC读取过比较大的数据(例如超过1GB),应该清楚在读取的时候,很可能会Java堆内存溢出,我们的解决方案通常是使用useCursorFetch读取或Stream读取来处理。使用Stream读取的方式通常的操作方式是在执行SQL…

    2022年7月17日
    32
  • SpringBoot + Vue 开发前后端分离的旅游管理系统

    SpringBoot + Vue 开发前后端分离的旅游管理系统旅游管理系统项目简介需求分析数据库建表环境搭建引入依赖(pom.xml)配置文件(application.properties)前端页面注册功能验证码工具类项目简介所需技术栈:后端技术栈:springboot+mybatis前后端分离:axios、json前端技术栈、技术架构:Vue、node.js要求:了解Vue组件之前的知识对springboot+mybatis较熟悉开发流程:需求分析库表设计编码(项目环境搭建+编码)项目调试项目部署上线需求分析

    2022年5月12日
    35
  • 【电子书下载】《Android应用程序开发与典型案例》完整版!!

    【电子书下载】《Android应用程序开发与典型案例》完整版!!图书简介:《android应用程序开发与典型案例》共23章,内容包含两大部分。第一部分是android程序设计基础,在介绍android环境搭建以及android系统基本控件和组件后,详细介绍了android系统应用编程中典型的技术,比如,android中的图形图像、多媒体编程、gps定位与地图编程等;第二部分是android程序ui设计,从手机软件的交互设计谈起,介绍了android用户界面

    2022年6月29日
    24
  • 什么是函数模板和类模板(一个c程序有几个函数)

    模板类与类模板、函数模板与模板函数等的区别函数指针=指向函数的指针指针函数=返回指针的函数数组指针=指向数组的指针指针数组=内容是指针的数组类模板=用来产生类的模板模板类=使用类模板产生的类函数模板=用来产生函数的模板模板函数=使用函数模板产生的函数后面转至https://www.cnblogs.com/wangduo/p/5559049.html …

    2022年4月16日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号