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

相关文章

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

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据