精华内容
下载资源
问答
  • Matlab中蚁群算法求解连续函数优化的原程序-蚁群算法连续函数优化问题matlab程序.rar 蚁群算法求解连续函数优化的原程序 所含文件: Figure41.jpg 蚁群算法连续函数优化问题matlab程序
  • 这本书既讲了工具箱优化函数,又有作者用matlab自编的优化算法,例子多,比较实用。 《精通MATLAB优化计算》的光盘程序.rar 《精通MATLAB优化计算》的光盘程序 《精通...
  • 内容简介《最优化方法及其Matlab程序设计》较系统地介绍了非线性最优化问题的基本理论和算法,以及主要算法的Matlab程序设计,主要内容包括(精确或非精确)线搜索技术、最速下降法与(修正)牛顿法、共轭梯度法、拟牛顿...

    内容简介《最优化方法及其Matlab程序设计》较系统地介绍了非线性最优化问题的基本理论和算法,以及主要算法的Matlab程序设计,主要内容包括(精确或非精确)线搜索技术、最速下降法与(修正)牛顿法、共轭梯度法、拟牛顿法、信赖域方法、非线性最小二乘问题的解法、约束优化问题的最优性条件、罚函数法、可行方向法、二次规划问题的解法、序列二次规划法等。设计的Matlab程序有精确线搜索的0.618法和抛物线法、非精确线搜索的Armijo准则、最速下降法、牛顿法、再开始共轭梯度法、BFGS算法、DFP算法、Broyden族方法、信赖域方法、求解非线性最小二乘问题的L.M算法、解约束优化问题的乘子法、求解二次规划的有效集法、SQP子问题的光滑牛顿法以及求解约束优化问题的SQP方法等,此外,《最优化方法及其Matlab程序设计》配有丰富的例题和习题,并在附录介绍了Matlab优化工具箱的使用方法。《最优化方法及其Matlab程序设计》既注重计算方法的实用性,又注意保持理论分析的严谨性,强调数值方法的思想和原理在计算机上的实现,读者只需具备微积分、线性代数和Matlab程序设计方面的初步知识即可学习《最优化方法及其Matlab程序设计》, 《最优化方法及其Matlab程序设计》可供数学与应用数学、信息与计算科学专业的本科生,应用数学、计算数学、运筹学与控制论专业的研究生,理工科相关专业的研究生,对最优化理论与算法感兴趣的教师及科技工作者阅读。

    编辑推荐《最优化方法及其Matlab程序设计》:21世纪高等院校教材

    2011-11-30 21:02:17 上传

    最优化方法

    目录第1章 最优化理论基础

    1.1 最优化问题的数学模型

    1.2 向量和矩阵范数

    1.3 函数的可微性与展开

    1.4 凸集与凸函数

    1.5 无约束问题的最优性条件

    1.6 无约束优化问题的算法框架

    习题1

    第2章 线搜索技术

    2.1 精确线搜索及其Matlab实现

    2.1.1 黄金分割法

    2.1.2 抛物线法

    2.2 非精确线搜索及其Matlab实现

    2.2.1 Wolfe准则

    2.2.2 Armijo准则

    2.3 线搜索法的收敛性

    习题2

    第3章 最速下降法和牛顿法

    3.1 最速下降方法及其Matlab实现

    3.2 牛顿法及其Matlab实现

    3.3 修正牛顿法及其Matlab实现

    习题3

    第4章 共轭梯度法

    4.1 共轭方向法

    4.2 共轭梯度法

    4.3 共轭梯度法的Matlab程序

    习题4

    第5章 拟牛顿法

    5.1 拟牛顿法及其性质

    5.2 BFGS算法及其Matlab实现

    5.3 DFP算法及其Matlab实现

    5.4 Broyden族算法及其Matlab实现

    5.5 拟牛顿法的收敛性

    习题5

    第6章 信赖域方法

    6.1 信赖域方法的基本结构

    6.2 信赖域方法的收敛性

    6.3 信赖域子问题的求解

    6.4 信赖域方法的Matlab程序

    习题6

    第7章 非线性最小二乘问题

    7.1 Gauss-Newton法

    7.2 Levenberg-Marquardt方法

    7.3 L-M算法的Matlab程序

    习题7

    第8章 最优性条件

    8.1 等式约束问题的最优性条件

    8.2 不等式约束问题的最优性条件

    8.3 一般约束问题的最优性条件

    8.4 鞍点和对偶问题

    习题8

    第9章 罚函数法

    9.1 外罚函数法

    9.2 内点法

    9.2.1 不等式约束问题的内点法

    9.2.2 一般约束问题的内点法

    9.3 乘子法

    9.3.1 等式约束问题的乘子法

    9.3.2 一般约束问题的乘子法

    9.4 乘子法的Matlab实现

    习题9

    第10章 可行方向法

    10.1 Zoutendijk可行方向法

    10.1.1 线性约束下的可行方向法

    10.1.2 非线性约束下的可行方向法

    10.2 梯度投影法

    10.2.1 梯度投影法的理论基础

    10.2.2 梯度投影法的计算步骤

    10.3 简约梯度法

    10.3.1 Wolfe简约梯度法

    10.3.2 广义简约梯度法

    习题10

    第11章 二次规划

    11.1 等式约束凸二次规划的解法

    11.1.1 零空间方法

    11.1.2 拉格朗日方法及其Matlab程序

    11.2 一般凸二次规划的有效集方法

    11.2.1 有效集方法的理论推导

    11.2.2 有效集方法的算法步骤

    11.2.3 有效集方法的Matlab程序

    习题11

    第12章 序列二次规划法

    12.1 牛顿一拉格朗日法

    12.1.1 牛顿一拉格朗日法的基本理论

    12.1.2 牛顿一拉格朗日法的Matlab程序

    12.2 SQP方法的算法模型

    12.2.1 基于拉格朗日函数Hesse矩阵的SQF·方法

    12.2.2 基于修正Hesse矩阵的SQP方法

    12.3 SQP方法的相关问题

    12.3.1 二次规划子问题的Hesse矩阵

    12.3.2 价值函数与搜索方向的下降性

    12.4 SQP方法的Matlab程序

    12.4.1 SQP子问题的Matlab实现

    12.4.2 SQP方法的Matlab实现

    习题12

    参考文献

    附录 Matlab优化工具箱简介

    A.1 线性规划

    A.2 二次规划

    A.3 无约束非线性优化

    A.4 非线性最小二乘问题

    A.5 约束条件的非线性优化命令

    A.6 最小最大值的优化问题

    序言运筹学的理论与方法广泛应用于工业与农业、交通与运输、国防与建筑,以及通信与管理等各个部门和领域,它主要解决最优计划、最优分配、最优决策以及最佳设计和最佳管理等最优化问题。本书所介绍的最优化方法又称为数学规划,是运筹学的一个重要分支,也是计算数学和应用数学的一个重要组成部分。

    本书系统地介绍了非线性优化的理论与方法,及其Matlab程序设计,适合数学与应用数学、信息与计算科学专业的本科生,应用数学、计算数学、运筹学与控制论专业的研究生,理工科相关专业的研究生,对最优化理论与算法感兴趣的教师及科技工作者阅读。读者只需具备微积分、线性代数和Matlab程序设计方面的初步知识。

    本书的主要内容包括最优化理论基础、(精确或非精确)线搜索技术、最速下降法与(修正)牛顿法、共轭梯度法、拟牛顿法、信赖域方法、非线性最小二乘问题的解法、(约束优化问题的)最优性条件、罚函数法、可行方向法、二次规划问题的解法、序列二次规划法等。设计的Matlab程序有精确线搜索的0.618法和抛物线法、非精确线搜索的Armijo准则、最速下降法、牛顿法、再开始共轭梯度法、对称秩1算法、BFGS算法、DFP算法、Broyden族方法、信赖域方法、求解非线性最小二乘问题的L—M算法、解约束优化问题的乘子法、求解二次规划的有效集法、牛顿一拉格朗日算法、SQP子问题的光滑牛顿法以及求解约束优化问题的SQP方法等。此外,本书配有丰富的例题和习题,并在附录介绍了Ma。tlab优化工具箱的使用方法。本书既注重计算方法的实用性,又注意保持理论分析的严谨性,强调数值方法的思想和原理在计算机上的实现。

    展开全文
  • matlab程序代码优化,性能优化 Matlab是一种强大的计算工具,方便的矩阵运算与工具箱为编程人员提供了极大的便利。但是其性能的缺失使得处理一些大计算量问题时显得效率不高,matlab程序优化应从几个方面展开: 1....

    matlab程序代码优化,性能优化

     

    Matlab是一种强大的计算工具,方便的矩阵运算与工具箱为编程人员提供了极大的便利。但是其性能的缺失使得处理一些大计算量问题时显得效率不高,matlab程序的优化应从几个方面展开:

    1.矩阵提前分配空间,矩阵第一次使用之后避免改变矩阵的维数。

    2.尽量使用矩阵运算,少使用循环。

    3.调用多次的计算代码写成函数形式,而不是写在脚本程序中,因为Matlab中,函数是被翻译成微码的,执行效率更高。

    4.如果无法避免使用循环,可以使用混合编程技术实现该段代码,这种方法在循环次数很大时可以将性能提升数十倍甚至上百倍。

    5.对于特定的算法,首先想到的不应是自己编写代码,而是查看matlab帮助文档,在matlab自带函数库中寻找是否存在现成函数。这样做有两个方面考虑,一方面matlab自带函数很多并不是真正的脚本文件,而是使用其他高级编程语言编译成的函数文件(这种函数文件的显著特点是打开该函数对应的m文件,会发现内容中只有注释而没有实际的代码,熟悉混合编程的同学看到这点会很熟悉,因为进行混合编程时,一般会创建一个和对应函数名相同的m文件用于保存注释信息。matlab的开发者也使用了这一规范,用户所看到的只是该函数的注释而已,实际的计算代码是保密的)使用这些函数,远比自己编写要高效;另一方面,使用自带函数,可以显著提高开发效率,减少编程者的工作量。

    综合以上考虑,开发高效的matlab计算程序的步骤是:

    1.需求分析:首先对所要实现的算法进行划分,哪些部分可以使用matlab的脚本语言进行处理,哪些部分可以使用混合编程技术实现。我个人倾向于对于核心的计算代码使用混合编程技术实现,数据的初始化、最后结果的可视化等使用matlab的脚本语言实现。这样选择的依据是核心计算代码使用混合编程技术实现后,真正的代码可以保密,对于用户,仅需提供其编译好的mex文件。另一方面,数据初始化需要很多数据处理代码,如果使用C语言实现,意味着大量的循环,而使用matlab可以用矩阵的方式处理而避免使用循环,编程容易而且不易出错。最后,结果的可视化一般需要调用底层的库,而使用C语言实现这些调用显然不如直接使用matlab容易。

    2.编写计算代码:分析好各个计算流程应该使用的编程方法之后,下一步就是对算法进行实现,这一过程需要到前面介绍的几个技巧,如矩阵提前分配空间,不要随便改变矩阵的维数等等。这部分最好分模块书写,各个部分之间做好封装和隔离,特别是混合编程时,使用C语言编写的代码要做好注释,我的个人习惯是C语言中用到的变量和m文件中的一样,这样可以方便识别和debug。使用混合编程技术时,C语言编写的代码是在matlab环境下进行编译的,这就使得debug变得极其困难,现在版本的Matlab还不支持对C语言代码进行debug,C函数运行过程中变量的监视几乎是不可能的。为了解决这一问题,我个人喜欢在专业的C编译环境下进行编程(如VC),将整个C函数可以分解为三个部分:1.数据输入;2.数据处理;3.结果保存。这三个部分中,第1个和第3个部分主要使用matlab的语法规则处理,而核心的第2部分,则是使用通用的C语言语法。实际debug主要关注的是第2个部分,于是我们可以在VC中编写一个测试版本的函数,这个函数中,所有内容都是和传统的C语言规范一样,debug完成后,修改其数据输入和输出部分的代码,使其满足C-MEX标准,之后把这一修正的代码到matlab环境下进行编译。

    3.模块耦合。通过第二步,我们已经获得了所有计算模块,且各个模块都已经没有bug,可以独立运行了,但是模块独立运行并不代表整个程序可以很好的工作,这一步所做的工作就是将各个模块进行耦合、拼接、调试,直到各个模块运行完好。前面第二步如果处理的好,这一步将会十分容易,即使存在bug,由于各个模块间隔离的很好,可以很方便的进行修正。

     

    http://hi.baidu.com/xxl_nowin/blog/item/63cf92dd57a7242a5882dd8b.html

    转载于:https://www.cnblogs.com/emanlee/archive/2012/02/27/2370504.html

    展开全文
  • MATLAB源码集锦-复杂网络度分布优化算法程序
  • 然后得到各函数的耗时以及被调用次数等信息,最后再根据这些信息对程序进行优化,接下来就使用MATLAB提供的这两种方法来进行程序分析,下一篇再对程序优化和程序调试做介绍。 第一种方法 使用一个工具——...

    程序分析

    前言

    不知道大家对System Generator系列中的资源分析以及时序分析的功能是否还有印象,这两个分析功能会将各模块所消耗的资源以及耗时都展现出来,用于资源或时序的优化,本篇将要记录的内容也与之有点相似,使用特定的功能或者语句对程序进行分析,然后得到各函数的耗时以及被调用次数等信息,最后再根据这些信息对程序进行优化,接下来就使用MATLAB提供的这两种方法来进行程序分析,下一篇再对程序优化和程序调试做介绍。

     

    第一种方法

    使用一个工具——Profiler,这个工具是MATLAB中的一个图形用户接口,可以用于分析程序运行时各个部分所消耗的时间,可以从以下几个方面提供程序运行信息:

    1)避免由于疏忽造成的非必要操作。

    2)替换运行较慢的算法,选择快速算法。

    3)通过存储变量的方式避免重复计算。

    接下来说下使用Profiler进行程序运行分析的步骤:

    1)查看Profiler生成的通体报告,查找运行时间最多的函数或调用最频繁的函数。

    2)查看这些函数的详细报告,查找其中运行时间最多的语句或调用最频繁的语句。

    3)确定运行时间最多的函数或代码是否存在改进的可能。

    4)单击界面链接,打开相应文件进行修改。

    5)重复进行上述的分析、修改,直至优化出满意的结果。

     

    Profiler的使用介绍

    1)打开方式

    第一个打开的地方在主页->代码->运行并计时。

    第二个打开的地方在编辑器->运行->运行并计时,要看到这个功能的前提就是需要打开一个M文件。

    第三个打开方式就是直接在命令行窗口输入:profile viewer

    以上的三种打开方式都可以打开一个探查器的窗口,也就是Profiler的界面,在“运行此代码”中输入需要分析的命令或表达式,然后点“启动探查”,就会开始对其进行分析。

    使用一串代码进行探查测试:[t,y] = ode23('lotka',[0 2],[20;20])

    点击开始探查后,会出现如下结果,红色框中的就是所探查的程序运行的信息名称:

    单击图中的蓝色字体,点的是红色框所选择的名称则会进行排序,点的是函数名称一栏中的函数,则会进入其内部观察更加详细的分析报告,这份报告中含有该函数中的每行代码的被调用次数和运行时间,以及子函数、函数列表等等,可以简单看下图的内容,此外,如果点击图中红色框里的蓝色字体,则会将此时的结果保存至新的窗口(该窗口会自动弹出),可以用于程序优化后与之对比,然后分析得到较优的结果。

    =============================

    注意:如果你一直点开始探查,在命令行窗口也有运行代码,但是就是没探查摘要出来,别慌,跟着下面的几张图改一下字体的预设即可解决。

    ================================

    第二种方法

    这个方法可以说是更加简单易懂,直接在需要计时的部分前后放置计时函数的开始和结束即可,即:计时器的开始—tic,计时器的结束—toc。

    因此使用的语法就是这样子的了:

    tic

           %需计时的程序代码

    toc

    t=toc%将记得的时间进行保存

    注:如果计时的程序过于简单,计时误差会相对比较大,大家可以自己使用该种方法,然后对比结果分析下。



    Matlab系列之运行程序的分析

    更多精彩等你发现!



    程序优化

    一般来说,实现同样的功能,可以采用不同的编程方法,而这些不同的编程方法也可能有着不同的运行速度,因此很多时候需要找到较优的那种方法,从而提高代码的运行效率,本篇将要记录的是一些提供M文件执行速度、优化内存管理的常用方法,具体的记录两个很实用的方法,然后简单再说下其他的方法,在平常编程的时候注意并学会使用这些方法,请往下慢慢看~

    第一种

    不知道你们在使用MATLAB进行循环计算的时候,有没有感觉到过,对矩阵的单个元素作循环相比将其转化成向量的形式进行运算的速度要慢很多,如果没太理解这句话,可以看以下的代码,然后再回过来理解:

    %程序1,矩阵的元素作循环

    clear all

    clc

    tic

    x=1;

    for k=1:1001

        y(k)=log10(x)

        x=x+0.01;

    end

    toc

    结果:

     

    %程序2,矩阵元素向量化

    clear all

    clc

    tic

    x=1:0.01:11;

    y=log10(x)

    toc

    结果:

     

    以上这两个代码只是分别对x进行循环累加以及直接向量化赋值给x,但是得到的运行速度却相差如此之大,当然这也是因为我把结果打印在了命令行窗口中,不然第一种的速度也还会快很多,那样的说服力显然没有这个强了,所以,你get到这个优化程序的操作了吗?

     

    第二种

    此处要记录的第二种方法很好理解,可以这样想象,一个人去做一件事,这件事是他从未接触过的,其结果也是无法预测的,那么他会感觉到实现起来很困难,最终实现的时间也是漫长的,但是如果这个人很清楚的知道自己要做的事,知道实现的方法,那么就可以很高效的完成这件事。

    类推,在for循环和while循环中,一个数组的大小随着循环不断的增加,很显然这会影响内存的使用效率,因为只要数组的维度变了,就要找到更大的连续内存区域,用于存放新的数组,就像是那个做事的人在不断尝试不同的方法去实现要做的事,很费时间,但是我们在最开始就给数组设置好一个它最终结果所需的恒定维度,也就是提前分配内存,这样就可以很好的提高内存使用效率,相当于直接给了做事的人一个正确的方法,他只需要照着做就行,很显然效率要高很多。

     

    接下来上几个简单的代码,来进一步加深内存预分配的印象:

    %原始代码

    x=0;

    for k=2:1000

        x(k)=x(k-1)+6;

    end

    %预分配内存后的代码

    x=zeros(1,1000);

    for k=2:1000

        x(k)=x(k-1)+6;

    end


    不知道你们发现没有,在编完原代码后,MATLAB其实会提醒你需要预分配内存,把鼠标移到x的波浪线上,就会出现:

     

    预分配内存的方法,本处代码使用的是zeros函数,将x的所有元素都赋值为0,这样节约了重新分配内存的时间,从而提高程序的效率,除了这个函数以外,还有cell函数也可以,不过这两个分别用于对数值数组和单元数组进行内存分配,不过要注意一点,使用zeros函数为数组分配内存时,如果数组类型要的不是double,则需要做些改变,可以使用下面的语句进行分配:

    A=zeros(100,’int8’);

    %这个就相当于为A分配了100*100的int8类型的内存。

    A=int8(zeros(100));

    %这个更好理解,就是生成了一个100x100的double类型的内存,再使用int8函数将其转化为int8的类型。

     

    其他方法

    这部分的方法都是比较好理解的,在平常编程前,记住这些要点,然后编写的时候应用上,可以简单有效的对程序进行优化。

    1)数组赋值时,避免数组类型的改变、以及第二种方法说的数组大小改变

    2)对实数进行操作,尽量避免对复数操作,复数也可以分实部虚部分别进行处理。

    3)合理使用逻辑运算符

    4)避免重载MATLAB中的内置函数和操作符

    5)通常情况下,函数的运行效率要高于脚本文件

    6)load和save函数效率要高于文件写和读取的操作

    7)多重循环的时候,可以在外运行循环次数少的,在内运行循环次数多的



    Matlab系列之程序优化

     



    程序调试

    学完了程序优化,再来个程序调试,关于MATLAB的编程基础我觉得也就差不多可以了,之后应该就是对数组、矩阵进行更加具体的操作,对数学函数进一步的了解等等,之后可以算是对MATLAB的进阶了吧,突然有点期待之后的记录了,不过先把本篇做好记录更重要点。

    正文

    程序为何需要调试呢?不知道你们想过这个问题没有,或者说遇到相关的处理时,有没有将其归类于程序调试。MATLAB程序中的错误包括语法错误和逻辑错误,语法错误是编译器会自动检测的,特别是代码标红处,就是代码对应的位置有红色波浪线的下划线,将鼠标光标移到标红处,可以显示出错误内容的提示,还有一种就是橙色的波浪形下划线,这种代表此处语法正确,但是,其他位置的代码有可能会因此产生错误,所以产生了橙色的下划线用于警示。在编程的时候,注意编译器的提示,可以避免大部分的语法错误,特别是函数名错误或者变量名错误之类的,这些在运行的时候更是直接在窗口提示错误,直接更改后就可重新运行。

     

    以上讲的都是关于语法的错误,修改起来也比较方便,但是逻辑错误就比较麻烦了,调试也会困难很多,因为它的影响因素有点多,有可能是算法本身的问题,也可能是指令使用不当造成的运行结果错误。但是相比于盲目的去更改自我认为的“错误”,使用一些调试的方法去检测并修改错误的代码块,不香吗?

     

    所以开始本篇的正题,讲讲程序调试的方法,通常是有两种方法:直接调试法和利用MATLAB调试工具进行调试。

    1、直接调试法

    直接调试法比较适用于简单的程序,或者说是简洁的程序,在调试的时候,程序运行中的变量的值是一个很重要的线索,但是在函数调用时只返回最后的输出变量,而不返回中间变量,所以可以采用以下的几种方法将中间变量显示出来进行查看:

    1)通过简单的分析,将可能出错的语句后面的分号“;”删掉,使得该行的结果可以直接显示在命令行窗口中,与期望值进行比较。

    2)直接使用disp函数显示中间变量的值

    3)在程序中合适的位置加keyboard指令,可以使得MATLAB运行到该处的时候,会暂停,直到使用者做出反应,在暂停的时候,命令行窗口原本的“>>”会变成“K>>”,使用者可以查看此时工作区的变量,可以改变变量的值,也可以输入return指定返回程序(用于函数),继续执行。

    4)在调试单独的函数时,可以先将函数弄成脚本文件,直接对输入变量赋值,然后运行M文件,这样的话,可以将中间变量都保存在工作区,然后运行完,能够查看全部中间变量的值,从而分析结果,找到错误的位置。

     

    2、工具调试法

    刚刚讲到的调试方法对简单的程序比较适用,当程序的规模比较大的时候,就可以使用MATLAB自带的调试工具进行调试,从而提高编程的效率,我的是MATLAB R2019b的版本,调试的工具栏,也就是打开M文件时,显示的编辑器的右边的部分。

    注意的调试操作如下:

    1)设置或清除断点,可以单击“断点”按钮,然后进行相应的操作,也可以直接单击需要设置断点的位置的左侧行号旁边的“-”,然后会出现一个红色的圆点,再次点击就可以删除该断点。

    2)设置或修改条件断点,条件断点是一种特殊的断点,只有当满足了指定的条件时,程序执行到此处就会暂停,但是条件不满足,程序就会继续运行,就比如if-else-end的语句,如果满足if的条件,就会进入if下的代码区,如果此区域有断点,就会在断点处停下,如果不满足就跳过,因此if下代码区的断点就不会影响程序的运行。

    3)启用或禁用当前行的断点,如果当前行不存在断点,则设置当前行为断点;如果当前行为断电,就改变当前的断点的状态为禁用状态,这个时候的断点会有个叉叉在红色圆圈上,在调试的时候,被禁用的断点将会被忽略。

    此外,在调试的时候,变量的值因为是找错误的重要线索,所以需要知道调试过程中,查看变量值的方法:

    (1)在编辑器中,将鼠标光标移到待查看的变量上,然后此处就会显示该变量的值。

    (2)在工作区查看该变量的值。

    (3)在命令行窗口输入该变量的名称,然后其值就会打印到窗口中。

    总之,在实际编程的时候,根据不同的情况,有针对性的使用这些功能,可以很大的提高调试效率以及编程效率。



    Matlab系列之程序调试

    更多精彩等你发现!



     

    展开全文
  • [详解MATLAB在最优化计算的应用(第2版)][李明][程序源代码]。本书首先介绍MATLAB的基本使用方法和程序设计基础,然后将MATLAB与最优化计算相结合,基于最优化理论与方法,讲解如何使用MATLAB求解最优化领域的...
  • 程序为粒子群算法在matlab中应用的程序,算法可计算三维函数,并在函数图像上显示最优值,分为七部分,简单易读
  • 机械优化设计作业 2 1.用二次插值法求函数 t t 1 t 2 极小值精度 e=0.01 在 MA TLAB 的 M 文件编辑器编写的 M 文件如下 f=inline(t+1(t-2^2't) a=0;b=3;epsilon=0.01; t1=a;f1=f(t1; t3=b;f3=f(t3; t2=0.5(t1+t3;...
  • SVM神经网络的参数优化---提升分类器性能 matlab程序 供大家学习
  • 而在用途方面也有很多,比如matlab优化问题目标函数可以是其他程序的运算结果,此时需要动态的每次优化调用其他程序,这时可以使用tcp实现两程序之间的数据交互,由matlab优化工具箱提供每次优化的设计变量值,...
     

    介绍

    TCP如此常用的通讯功能,matlab自然也是支持的。而在用途方面也有很多,比如matlab优化问题中目标函数可以是其他程序的运算结果,此时需要动态的每次优化调用其他程序,这时可以使用tcp实现两程序之间的数据交互,由matlab的优化工具箱提供每次优化的设计变量值,有某程序提供基于设计变量得出的运算结果值作为目标函数的解。

    TCP使用方法

    Matlab 对TCP的封装很好,只有在建立和关闭tcp需要专用的函数,其他操作均与文件操作完全一致。

    下面先给出一个用于优化的范例:

    主脚本:

    clc;clear;
    %开启tcp
    global mtcpip   %用全局变量方便优化函数中使用tcp
    global circle_number
    circle_number=0;
    mtcpip=tcpip('127.0.0.1', 8000);
    fopen(mtcpip);
    fwrite(mtcpip,['Matlab Connect in',char(13), char(10)]) 
    %优化算法--
    current_value = [123123  123123 123123 123321 123123  123123 13 123123 123123];
    lb=[];
    ub=[];
    new_error = fmincon(@matlab_function,current_value,[],[],[],[],lb,ub);%优化
    % 优化技术-关闭tcp
    fwrite(mtcpip,['Matlab Disconnect',char(13), char(10)]) 
    fclose(mtcpip);
    delete(mtcpip);

    优化函数:

    function [ f ] = matlab_function( x )
    global mtcpip
    global circle_number
    circle_number=circle_number+1;
    x_size = size(x);
    send_text=['matlabvalue--'];
    for i=1:1:x_size(2)
        if i==x_size(2)
            send_text=[send_text,num2str(x(i),'%.4f'),char(13), char(10)];
        else
            send_text=[send_text,num2str(x(i),'%.4f'),';'];
        end
    end
    fwrite(mtcpip,send_text);
    while 1
        A = fread(mtcpip, 20);
        text = char(A);
        text_size = size(text);
        if text_size(1)<2
            continue;
        end
        if  text(1) == 'm' && text(2) == 'r'
            text=text';
            text = strrep(text,'@','');//符号替换
            text = strrep(text,'mr','');
            text = strrep(text,'#','');//删除末尾多余的占位符,我用#作为占位符了
            f = str2double(text);
            ['circle one begin',num2str(circle_number,'%.4f')]
            break;
        end
    end
    end

    此范例的优化函数中利用一个while 1实现了阻塞,会不断的循环等待其他程序算出结果后成功接收到结果才完成单步优化计算。我设定了结果的固定表示格式

    “mrXXXXXX###########@”消息总长度为20,末尾为@作为结束符,mr作为开头,XXXX为消息实际内容,#为占位符,以此方式保证每次发送消息均为20长度,同时可以通过数据头的mr确定收到的内容是不是传给matlab的结果文件(若多个tcp通讯需要做此判断防止发送错误,导致后续结果计算错误),只有当结果均计算正确,才目标函数返回值赋值为接收到的结果,并break进入下一次优化迭代

    创建tcp

    tcpip()函数创建一个tcp对象,可以在matlab中用help tcpip查到帮助,上述范例为开启客户端。对于目标主机ip可以用’localhost’代替127

    注意此函数第三项参数用来配置为服务端还是客户端,若不写默认为客户端

    注意开启完成后的返回值一定要保存,后续开启、收发和关闭均需要使用,此处因为需要跨多个m文件使用此tcp所以设置为了全局变量

    开启tcp

    fopen即可,参数传入tcp对象

    关闭tcp

    fclose? 就可以关闭一个已经开启的tcp了,参数传入tcp对象

    建议用delete释放tcp对象的内容

    收发

    启动tcp以后,matlab支持直接用文件读写的方式进行tcp消息收发,直接使用fwrite、fread即可,第一个参数要传入开启tcp对象

    其他

    matlab发送回车,换行符的方法

    matlab不支持在字符串中用\n实现换行,但是可以直接发送对应ASCII码,可以通过char(13), char(10)实现换行的发送,注意这两个对应的是\r\n,windows中是用\r\n实现换行,若linux直接发送\n的10即可。

    matlab字符串连接

    很简单[send_text,num2str(x(i),’%.4f’),char(13), char(10)],直接用行向量数组即可,本身matlab就是用char数组表示字符串的

    接收数据为列向量,转行向量方法

    直接text=text’;即可,和矩阵操作一样

    别用string()去强制字符串,matlab中本身就是用char数组表示字符串,没有单独的字符串概念,转换完也没区别

    字符串处理-替换

    text = strrep(text,’@’,”);实现了吧text中的所有@删除,上述范例是因为发送来的数据是固定的格式,对格式做预处理

    由于matlab接收tcp消息是按照固定长度,所以发送端若发送的内容不够长,可以在后面加占位符,matlab接收到以后删除占位符即可

    接收长度限制

    A = fread(mtcpip, 20);

    此函数指定了接收的长度,若消息发送的长度不够,会一直阻塞,直到超时以后才会接收已有的为满足长度要求的数据,为了保证立即接收,建议发送数据末尾用占位符,接收到以后再替换掉。

    Techie亮博客,转载请注明:Coologic » Matlab中TCP通讯-实现外部程序提供优化目标函数解

    Coologic 博客域名已更改,已从 www.techieliang.com 改为 www.coologic.cn,上述链接地址受到影响,若需查看源文请手动修改,多有不便,敬请谅解。
    展开全文
  • MATLAB 优化程序【profile简明用法】

    千次阅读 2018-05-09 22:45:49
    编程过程,经常需要评估哪一部分代码比较耗费时间,这对于优化代码非常重要。Visual Studio的profile功能可以评测,Matlab同样也有这个功能,而且使用起来也比较简单。-基本命令 profile on : 开启profile ...
  • matlab练习程序(粒子群优化PSO)

    千次阅读 2017-03-03 20:39:42
    matlab练习程序(粒子群优化PSO) 算法没有和图像处理直接相关,不过对于图像分类的模式识别相关算法,也许会用到这个优化算法。 算法步骤: 1.首先确定粒子个数与迭代次数。 2.对每个粒子随机初始化位置...
  • 优化平时作业 一目标规划 1题目见书例题 P110 例 4 2解题方法利用 Lingo 求解 3具体步骤 1.对应于第一优先等级建立线性规划问题 model: min=-d1; 5*x1+10*x2; x1-2*x2+d1_-d1=0; end 运行结果 -d1=0 2 对应于第...
  • 主要用于数值迭代,很不错的一阶梯度法、非最小二乘法、牛顿法等数值迭代的matlab源代码。我试过的哦。
  • 包含冠状病毒群体免疫优化算法(CHIO)和matlab程序及论文,分享给大家学习。 2020年Mohammed Azmi Al-Betar等人提出的一种新的基于自然的优化算法——冠状病毒群体免疫优化算法(CHIO)。其灵感来源于世界传播的灾难性...
  • 内附程序,弹道导弹突击已成为现代战争实施远程精确打击的重要手段,具有速度快、威力大、打击精度高、突防能力强等特点。防御方如何根据反导武器系统拦截能力和导弹进攻航路对拦截武器进行优化部署,是当前构建...
  • matlab一些程序

    2015-07-23 20:09:16
    matlab1程序有一些基本的小程序,包括插值,拟合,绘图,优化,解微分方程,图论的一些算法
  • 包括了二分法,斐波那契法,黄金分割法,二次插值法,三次插值法,不确定线性搜索法的matlab程序m文件。这些是最优化中很重要的程序,分享给大家学习。
  • 《最优化matlab程序设计》书后源码和ppt。ppt其实就是书原文。
  • 优化-牛顿法求最优解matlab程序,例子对应于电子科技大学最优化课程的一个例题,用matlab程序实现牛顿法计算一个优化问题。
  • Matlab优化方法复合形法程序有需要的可以来下-minconSimpSearch2.rar 在做复合形法优化时,用到《精通MATLAB优化设计》一书的复合形法程序,发现做其他例题时运行不了。 去掉bug后,改进如下,如果你遇到...
  • 变尺度法,BFGS法比DFP数值法稳定性好。用matlab编写的BFGS优化算法程序,通过测试可以运行。
  • 关注梯度下降法又称为最速下降法,是求解无约束优化问题最简单和最古老的方法之一。大概意思就是:在脑海想象一下,你站在一座山上,怎么找到最快下山的方法,这时你当然会朝着最陡峭的方向前进,到达一个点后,...
  • 精品文档 最优化平时作业 一目标规划 1题目见书例题?P110?例?4 2解题方法利用?Lingo?求解 3具体步骤 1.对应于第一优先等级建立线性规划问题 model: min=-d1; 5*x1+10*x2; x1-2*x2+d1_-d1=0; end 运行结果?-d1=0 2?...
  • 本算法为混合算法,粒子群算法和遗传算法相结合,有很好的性能,程序中以函数优化为例,并且有适应度趋势图,代码有注释!代码有注释!代码有注释!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 678
精华内容 271
关键字:

matlab中程序优化

matlab 订阅