25.3 matlab里面的10中优化方法介绍——Nelder-Mead法(matlab程序)

1. 简述

fminsearch函数用来求解多维无约束的线性优化问题

用derivative-free的方法找到多变量无约束函数的最小值

语法

x = fminsearch(fun,x0)

x = fminsearch(fun,x0,options)

x,fval\] = fminsearch(...) \[x,fval,exitflag\] = fminsearch(...) \[x,fval,exitflag,output\] = fminsearch(...) 解释 fminsearch能够从一个初始值开始,找到一个标量函数的最小值。通常被称为无约束非线性优化 x = fminsearch(fun,x0) 从x0开始,找到函数fun中的局部最小值x,x0可以是标量,向量,矩阵。fun是一个函数句柄 x = fminsearch(fun,x0,options) 以优化参数指定的结构最小化函数,可以用optimset函数定义这些参数。(见matlab help) \[x,fval\] = fminsearch(...)返回在结果x出的目标函数的函数值 \[x,fval,exitflag\] = fminsearch(...) 返回exitflag值来表示fminsearch退出的条件: 1--函数找到结果x 0--函数最大功能评价次数达到,或者是迭代次数达到 -1--[算法](http://lib.csdn.net/base/datastructure "算法")由外部函数结束 \[x,fval,exitflag,output\] = fminsearch(...) 返回一个结构输出output,包含最优化函数的信息:output.algorithm 使用的优化算法 output.funcCount 函式计算次数 output.iterations 迭代次数 output.message 退出信息 另外 fun是需要最小化的函数,他的输入为input,输出为标量f,**目标函数在x上作出估计,函数可以为M文件的一个句柄函数(当是M文件时,用单引号括起文件名)**: functionx = fminsearch(@myfun, x0) 这里function f = myfun(x) f = ... 其自变量为x 或者直接写出 asx = fminsearch(@(x)sin(x\^2), x0); 算法 fminsearch使用单纯型法,这是一种不会使用数值或者梯度分析的直接的方法 假如x的长度为n,那么会有n+1个顶点,两维空间中,单纯型是三角形,三维空间,他是一个锥形。搜索的每一步中,都会产生离当前单纯型比较近的点,在新的点上的函数值回合单纯型各个顶点上的值比较,一般都会有一个定点被替代,产生一个新的单纯型,重复步骤,直到单纯型的大小小于阈值。 限制 fminsearch可以处理不连续的问题,如果得不到全局最优,则其会得到局部最优 它只能最小化时数,复数并不在其能力范围之内,且f(x)的返回值也必须是时数,如果x为复数,则其必须分解为实部和虚部两部分。 我们可以稍微对进行一些变换,就可实现利用fminsearch进行参数估计。 **2.** **代码** **主程序:** %% 用Nelder-Mead方法求最优化解 f1203 = inline('x(1)\*(x(1)-5-x(2))+x(2)\*(x(2)-4)','x'); x0 = \[0 4\]; TolX = 1e-4; TolFun = 1e-9; MaxIter = 100; \[xN,fN\] = Opt_Nelder(f1203,x0,TolX,TolFun,MaxIter) %取最小值点以及此处的最小值 \[xF,fF\] = fminsearch(f1203,x0) %用MATLAB内置函数fminsearch求解 子程序; function \[xo,fo\] =Opt_Nelder(f,x0,TolX,TolFun,MaxIter) %Nelder-Mead法用于多维变量的最优化问题,维数\>=2. N = length(x0); if N == 1 %一维情况,用二次逼近计算 \[xo,fo\] = Opt_Quadratic(f,x0,TolX,TolFun,MaxIter); return end S = eye(N); for i = 1:N %自变量维数大于2时,重复计算每个子平面的情况 i1 = i + 1; if i1 \> N i1 = 1; end abc = \[x0; x0 + S(i,:); x0 + S(i1,:)\]; %每一个定向子平面 fabc = \[feval(f,abc(1,:)); feval(f,abc(2,:)); feval(f,abc(3,:))\]; \[x0,fo\] = Nelder0(f,abc,fabc,TolX,TolFun,MaxIter); if N \< 3 %二维情况不需重复 break; end end xo = x0; **3.** **运行结果** ![02fff0129228438c9b55644fdd68bd51.png](https://file.jishuzhan.net/article/1684103715033714690/ce907f4abe0f4d159c5e3401bbcc5aed.png) ![81fd1919a7e04582bfd517f654f1a701.png](https://file.jishuzhan.net/article/1684103715033714690/f9159c2aa90347429f21989ddf81d12c.png)

相关推荐
玩代码3 分钟前
CompletableFuture 详解
java·开发语言·高并发·线程
剪一朵云爱着8 分钟前
力扣2438. 二的幂数组中查询范围内的乘积
算法·leetcode
hz_zhangrl9 分钟前
CCF-GESP 等级考试 2025年6月认证C++三级真题解析
开发语言·c++·青少年编程·gesp·gesp2025年6月·c++三级
东风西巷1 小时前
NealFun安卓版:创意无限,娱乐至上
android·人工智能·智能手机·娱乐·软件需求
人生在勤,不索何获-白大侠1 小时前
day21——特殊文件:XML、Properties、以及日志框架
xml·java·开发语言
肥猪猪爸2 小时前
BP神经网络对时序数据进行分类
人工智能·深度学习·神经网络·算法·机器学习·分类·时序数据
Keep learning!2 小时前
深度学习入门代码详细注释-ResNet18分类蚂蚁蜜蜂
人工智能·深度学习·分类
Liudef063 小时前
神经辐射场 (NeRF):重构三维世界的AI新视角
人工智能·重构
dongzhenmao4 小时前
P1484 种树,特殊情形下的 WQS 二分转化。
数据结构·c++·windows·线性代数·算法·数学建模·动态规划
Dxy12393102164 小时前
Python PDFplumber详解:从入门到精通的PDF处理指南
开发语言·python·pdf