MATLAB多维无约束最小化函数 fminunc 、fminsearch与多维有约束函数fmincon

本文主要是介绍MATLAB多维无约束最小化函数 fminunc 、fminsearch与多维有约束函数fmincon,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、多维无约束最小化函数 fminunc

1、函数模型

min f(x),式中f(x)为无约束多变量函数,x是向量或矩阵

2、调用格式

x = fminunc(fun,x0)

matlab代码

%% 多维无约束极值
f=@(x) (x(1)^2+2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2))
x0=[0 0];
[x,favl]=fminunc(f,x0)%绘制处函数图形,判断求解是否正确
X=-10:0.1:10;
Y=X;
[x,y]=meshgrid(X,Y);
f=(x.^2+2*x).*exp(-x.^2-y.^2-x.*y);
mesh(x,y,f)

x = fminunc(fun,x0,options)

syms x y
f=(x^2+2*x)*exp(-x^2-x^2-x*y);% f=@(x) (x(1)^2+2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2))
% x0=[1 1];
% options=optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true)
options=optimoptions('fminunc','Algorithm','quasi-newton','PlotFcns',@optimplotfval)[x,favl]=fminunc(f,x0,options)%提供梯度文件
function [f,g]=TD(x)f = (x(1)^2+2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2));if nargout > 1 % gradient requiredg = [exp(- 2*x(1)^2 - x(2)*x(1))*(2*x(1) + 2) - exp(- 2*x(1)^2 - x(2)*x(1))*(x(1)^2 + 2*x(1))*(4*x(1) + x(2))-x(1)*exp(- 2*x(1)^2 - x(2)*x(1))*(x(1)^2 + 2*x(1))];
end
options=optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true)
x0=[1 1][x,favl]=fminunc(@TD,x0,options)

x = fminunc(problem)

problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';x = fminunc(problem)

[x,fval] = fminunc(___)

返回极值点函数值fval

[x,fval,exitflag,output] = fminunc(___)

返回一个描述fminunc退出条件的值exitflag,以及一个包含有关优化过程信息的结构输出。

[x,fval,exitflag,output,grad,hessian] = fminunc(___)

返回梯度grad和海塞矩阵hessian

3、关于meshgrid的一点说明

在画一个二维图形或者三维图形的时候,我们需要指定一个二维平面或者三维空间。就像绘制一维图形需要指定自变量x的范围一样。

X=-10:0.1:10; 
Y=X;
[x,y]=meshgrid(X,Y);
f=(x.^2+2*x).*exp(-x.^2-y.^2-x.*y);
mesh(x,y,f)

以如下代码为例,其绘制出的图形的二维平面的范围与X和Y相同,是一个矩阵,该矩阵如下所示(这里仅展示x的矩阵)。

二、多维无约束最小化函数 fminsearch

1、目标模型

其目标模型与fminunc相同,不同的是该函数使用无导数方法查找无约束的多元函数的最小值,而fminunc使用有导数方法。

2、调用格式

x = fminsearch(fun,x0)

f=@(x) (x(1)^2+2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2))
x0=[0 0];
[x,fval]=fminsearch(f,x0)

x = fminsearch(fun,x0,options)

% 显示函数值的求解
x0=[0 0];
options = optimset('PlotFcns',@optimplotfval);
[x,fval]=fminsearch(@demo_9_28_1,x0,options);

x = fminsearch(problem)

返回极值点x

[x,fval] = fminsearch(___)

返回极值点函数值fval

[x,fval,exitflag] = fminsearch(___)

返回一个描述退出条件的值exitflag。

[x,fval,exitflag,output] = fminsearch(___)

返回带有有关优化过程信息的结构输出output。

三、多维无约束最小化函数 fmincon

1、目标模型

min  f(x)

 s.t  A*x<=b           线性不等式约束

       Aeq*x=beq     线性等式约束

       c(x)<=0          非线性不等式约束

       ceq*x=0         非线性等式约束

      lb=<x<=ub       最优解x的上下界

2、调用格式

x = fmincon(fun,x0,A,b) 线性不等式约束

f=@(x) -x(1)*x(2)*x(3);
A=[-1 -1 -1;1 2 2]
b=[20 5]
x0=[1 1 1];
[x,fval]=fmincon(f,x0,A,b,[],[])

x = fmincon(fun,x0,A,b,Aeq,beq)   线性不等式约束+等式约束

f=@(x) -x(1)*x(2)*x(3);
A=[-1 -1 -1;1 2 2]
b=[20 5]
x0=[1 1 1];
Aeq=[1 1 0];
beq=4
[x,fval]=fmincon(f,x0,A,b,Aeq,beq)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)  线性不等式约束+等式约束+x的上下界

f=@(x) -x(1)*x(2)*x(3);
A=[-1 -1 -1;1 2 2]
b=[20 5]
x0=[1 1 1];
Aeq=[1 1 0];
beq=4
lb=[4 2 1]
[x,fval]=fmincon(f,x0,A,b,Aeq,beq,lb)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)  线性不等式约束+等式约束+x的上下界+非线性约束

function [c,ceq]=con(u) %非线性约束函数文件
x=u(1);
y=u(2);
z=u(3);
c=[];
ceq=x*y+x*z+y*z-80;f=@(x) -x(1)*x(2)*x(3);
x0=[5 5 5];
[x,fval]=fmincon(f,x0,[],[],[],[],[],[],@con)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 线性不等式约束+等式约束+x的上下界+非线性约束+选项设置

function [f,g]=con1(u) %函数与梯度的.m文件
x=u(1);
y=u(2);
z=u(3);
f=-x*y*z;
if nargout > 1 % gradient requiredg = [-y*z-x*z-x*y;];
endfunction [c,ceq]=demo_9_29_1(u)
x=u(1);
y=u(2);
z=u(3);
c=[];
ceq=x*y+x*z+y*z-80;
end%% 提供梯度
options = optimoptions('fmincon','SpecifyObjectiveGradient',true);
syms x y z
ff=-x*y*z;
g=gradient(ff);
x0=[5 5 5];
[x,fval]=fmincon(@con1,x0,[],[],[],[],[],[],@con)

x = fmincon(problem)  

[x,fval] = fmincon(___)  返回最优解x和该点函数值fval

[x,fval,exitflag,output] = fmincon(___) 返回函数退出条件exitflag和有关优化过程信息的结构输出output

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)

 

这篇关于MATLAB多维无约束最小化函数 fminunc 、fminsearch与多维有约束函数fmincon的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680269

相关文章

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i