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

相关文章

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结