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

2023-11-05 05:30

本文主要是介绍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--算法由外部函数结束

[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

81fd1919a7e04582bfd517f654f1a701.png

 

 

这篇关于25.3 matlab里面的10中优化方法介绍——Nelder-Mead法(matlab程序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

Java中的StringUtils.isBlank()方法解读

《Java中的StringUtils.isBlank()方法解读》:本文主要介绍Java中的StringUtils.isBlank()方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录所在库及依赖引入方法签名方法功能示例代码代码解释与其他方法的对比总结StringUtils.isBl

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

CentOS7增加Swap空间的两种方法

《CentOS7增加Swap空间的两种方法》当服务器物理内存不足时,增加Swap空间可以作为虚拟内存使用,帮助系统处理内存压力,本文给大家介绍了CentOS7增加Swap空间的两种方法:创建新的Swa... 目录在Centos 7上增加Swap空间的方法方法一:创建新的Swap文件(推荐)方法二:调整Sww

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基