[设计]罚函数法MATLAB程序
- 格式:doc
- 大小:22.00 KB
- 文档页数:9
一、引言我们需要明确什么是等式约束最优化问题。
在实际应用中,经常会遇到这样的问题:在满足一定的条件约束下,寻找一个使得某个目标函数达到最优值的解。
而等式约束最优化问题就是在满足一系列等式约束条件的前提下,求解出目标函数的最优值和对应的解向量。
在数学领域,等式约束最优化问题有着重要的理论和实际意义,对于工程、经济、管理等领域都有着广泛的应用。
二、问题描述一个典型的等式约束最优化问题可以用如下的数学形式来描述:minimize f(x)subject to:g(x) = 0其中,f(x)是目标函数,x是自变量向量,g(x)是等式约束条件函数。
三、外点罚函数法外点罚函数法是一种常用的方法,用于求解等式约束最优化问题。
它的基本思想是通过对目标函数和约束条件进行适当的变换,将等式约束问题转化为无约束问题。
具体地,外点罚函数法通过引入罚函数,将约束条件融入到目标函数中,构造出一个新的优化问题。
然后将这个新问题求解为原问题的近似解。
在优化的过程中,罚函数的惩罚项会惩罚那些违反约束条件的解,从而使得优化过程能够逼近满足约束条件的最优解。
四、matlab中的外点罚函数法求解在matlab中,可以利用现成的优化工具箱来求解等式约束最优化问题。
其中,fmincon函数是用来求解带有等式约束的最优化问题的。
它允许用户自定义目标函数和约束条件函数,并指定优化的初始点和其他参数。
通过在fmincon函数中调用外点罚函数法求解等式约束最优化问题,可以得到目标函数的最优值和对应的解向量。
五、实例分析为了更加直观地理解matlab中外点罚函数法的应用,我们来举一个简单的实例。
假设我们要求解如下的等式约束最优化问题:minimize f(x) = x1^2 + x2^2subject to:g(x) = x1 + x2 - 1 = 0我们需要将目标函数和约束条件转化成matlab可以识别的形式。
我们可以利用fmincon函数来求解这个最优化问题。
MATLAB实验指导书(共5篇)第一篇:MATLAB实验指导书MATLAB 实验指导书皖西学院信息工程学院实验一 MATLAB编程环境及简单命令的执行一、实验目的1.熟悉MATLAB编程环境二、实验环境1.计算机2.MATLAB7.0集成环境三、实验说明1.首先应熟悉MATLAB7.0运行环境,正确操作2.实验学时:2学时四、实验内容和步骤1.实验内容(1)命令窗口的使用。
(2)工作空间窗口的使用。
(3)工作目录、搜索路径的设置。
(4)命令历史记录窗口的使用。
(5)帮助系统的使用。
(6)了解各菜单的功能。
2.实验步骤(1)启动MATLAB,熟悉MATLAB的桌面。
(2)进入MATLAB7.0集成环境。
(3)在命令窗口执行命令完成以下运算,观察workspace的变化,记录运算结果。
1)(365-52⨯2-70)÷3 2)>>area=pi*2.5^2 3)已知x=3,y=4,在MATLAB中求z:x2y3 z=2(x-y)4)将下面的矩阵赋值给变量m1,在workspace中察看m1在内存中占用的字节数。
⎡162313⎤⎢511108⎥⎥m1=⎢⎢97612⎥⎢⎥414151⎣⎦执行以下命令>>m1(2 , 3)>>m1(11)>>m1(: , 3)>>m1(2 : 3 , 1 : 3)>>m1(1 ,4)+ m1(2 ,3)+ m1(3 ,2)+ m1(4 ,1)5)执行命令>>helpabs 查看函数abs的用法及用途,计算abs(3 + 4i)6)执行命令>>x=0:0.1:6*pi;>>y=5*sin(x);>>plot(x,y)7)运行MATLAB的演示程序,>>demo,以便对MATLAB有一个总体了解。
五、思考题1、以下变量名是否合法?为什么?(1)x2(2)3col(3)_row (4)for2、求以下变量的值,并在MATLAB中验证。
一、概述Matlab是一种强大的工程计算软件,在工程领域有着广泛的应用。
对于学习Matlab程序设计来说,通过例题学习是非常有效的方法。
通过实际的例题练习,可以帮助学生更深入地理解Matlab的基本原理和应用技巧。
本文将介绍几个常见的Matlab程序设计例题,并进行详细的分析和讲解,希望能够帮助读者加深对Matlab程序设计的理解。
二、例题一:矩阵运算题目:编写一个Matlab程序,实现两个任意大小的矩阵相加的运算。
1.我们需要定义两个任意大小的矩阵A和矩阵B,可以通过rand函数生成随机矩阵,也可以手动输入矩阵的元素。
2.编写Matlab程序,使用矩阵的加法运算符“+”进行矩阵相加操作。
3.输出矩阵相加的结果,并进行验证和检查。
通过这个例题,可以加深对Matlab矩阵运算的理解,包括矩阵的定义、矩阵相加的操作和结果输出的方法。
三、例题二:函数绘图题目:编写一个Matlab程序,绘制sin函数的曲线图像。
1.我们需要定义sin函数的自变量范围和取值步长,可以使用linspace函数生成自变量的取值范围。
2.编写Matlab程序,调用sin函数计算自变量对应的函数值。
3.接下来,使用plot函数绘制sin函数的曲线图像,并设置图像的标题、坐标轴标签等其他参数。
4.输出绘制好的sin函数曲线图像,并进行观察和分析。
通过这个例题,可以了解Matlab中函数绘图的基本方法,包括自变量的定义、函数值的计算和图像的绘制等操作。
四、例题三:数值积分题目:编写一个Matlab程序,实现对指定函数在指定区间上的数值积分。
1.我们需要定义积分的目标函数和积分区间,在Matlab中可以使用function定义目标函数,也可以手动输入目标函数和积分区间。
2.编写Matlab程序,调用Matlab内置的数值积分函数(如quad、quadl等)进行数值积分的计算。
3.输出数值积分的结果,并与解析解进行比较和分析。
通过这个例题,可以了解Matlab中数值积分的计算方法,包括目标函数的定义、积分区间的设定和数值积分函数的调用。
MATLAB中常用函数的使用方法解析一、简介MATLAB(Matrix Laboratory)是一款用于数值计算和科学研究的高级编程语言和环境,它提供了许多强大的函数和工具包,方便用户进行数据处理、可视化、建模和仿真等工作。
在本文中,我们将解析一些在MATLAB中常用的函数,让读者掌握它们的基本使用方法。
二、矩阵运算函数1. abs函数:用于计算矩阵中各元素的绝对值。
2. inv函数:用于求矩阵的逆矩阵。
3. det函数:用于计算矩阵的行列式。
4. rank函数:用于计算矩阵的秩。
5. svd函数:用于进行奇异值分解,将矩阵分解为三个矩阵相乘的形式。
6. eig函数:用于计算方阵的特征值和特征向量。
7. trace函数:用于计算矩阵的迹,即矩阵对角线上元素的和。
三、向量操作函数1. dot函数:用于计算两个向量的点积。
2. cross函数:用于计算两个三维向量的叉积。
3. norm函数:用于计算向量的模。
4. angle函数:用于计算两个向量之间的夹角。
5. linspace函数:用于生成一维等差数列。
四、数学函数1. sin函数:计算给定角度的正弦值。
2. cos函数:计算给定角度的余弦值。
3. tan函数:计算给定角度的正切值。
4. exp函数:计算给定数的指数值。
5. log函数:计算给定数的自然对数。
6. sqrt函数:计算给定数的平方根。
7. power函数:计算给定数的幂。
五、数据统计函数1. mean函数:计算矩阵或向量的均值。
2. median函数:计算矩阵或向量的中位数。
3. std函数:计算矩阵或向量的标准差。
4. var函数:计算矩阵或向量的方差。
5. cov函数:计算矩阵或向量的协方差。
六、数据处理函数1. sort函数:对矩阵或向量进行排序。
2. unique函数:去除矩阵或向量中的重复元素。
3. reshape函数:改变矩阵的形状。
4. repmat函数:将矩阵或向量进行复制扩展。
MATLAB函数的使用方法及示例详解引言:MATLAB是一种用于算法开发、数据可视化、数据分析和数值计算的强大工具。
它不仅具备丰富的内置函数库,还可由用户编写函数,以满足各种复杂的计算需求。
本文将详细介绍MATLAB函数的使用方法,并通过示例来解释其具体应用。
一、MATLAB函数的定义与调用在MATLAB中,函数是一段封装了特定操作的可重复使用的代码,它可以接受输入参数,并返回输出结果。
函数的定义与调用是使用MATLAB的重要基础。
函数的定义:MATLAB中函数的定义以关键词"function"开头,后面跟着函数名和一对圆括号。
函数名用于函数的调用,圆括号内可定义输入参数。
函数体代码位于圆括号之后,用于实现函数的具体功能。
举个例子,定义一个简单的函数用于计算两个数的和:```function result = add(a, b)result = a + b;end```在这个例子中,`add`是函数名,`a`和`b`是输入参数,`result`是输出结果。
函数的调用:函数的调用通过函数名和相应的参数实现。
调用函数时,需要提供参数的值。
调用函数后,函数会执行其功能,并返回结果。
我们使用上面定义的`add`函数来进行示例调用:```x = 3;y = 5;sum = add(x, y);disp(sum);```在这个例子中,我们定义了两个变量`x`和`y`,分别赋值为3和5,然后调用`add`函数,并将结果赋值给变量`sum`。
最后,使用`disp`函数显示`sum`的值。
二、MATLAB内置函数的使用方法MATLAB提供了丰富的内置函数库,涵盖了数学、统计、信号处理、图像处理等各个领域。
下面我们将介绍几个常用的内置函数及其使用方法。
1. `sin`函数:`sin`函数用于计算给定角度的正弦值。
其使用方法为:```result = sin(angle);```其中,`angle`为角度的值,`result`为计算得到的正弦值。
本科毕业设计题目:惩罚函数法求解多维非线性优化问题的算法设计学院:专业:学号:学生姓名:指导教师:日期:摘要现在的科技进步速度惊人,可以用一日千里来形容了。
在我们所学的专业课程中,如自动控制原理、现代控制理论等课程,一般讲的都是线性系统。
但是,在现实生活中,我们所碰到的不可能是线性系统。
因为在实际中,总是会有很多不确定的因素会影响到系统的运行,诸如温度、压力、湿度等等。
所以本文主要是研究非线性函数在约束条件下的优化。
本文是在Matlab环境下,在M文件中通过编写程序来实现遗传算法,进而来求得函数的最优解。
所以主要程序都是M文件来完成的。
编写的程序可以实现一维函数、二维函数的优化,并且能将算法实现在过程通过Matlab的plot函数画图,图像可以像动画一样呈现在我们面前。
通过实验,我们可以清晰的看见算法实现的过程。
计算一维函数时,第一代在约束范围内随机产生inn个点(即inn个第一代个体),然后经过以遗传算法为核心的算法运算gn代后,最终会集中到一个点上去。
这个点就是要求的那个点。
求二维函数优化算法的原理和计算一维的原理是一样的,但是在画图方面就比一维的难一点。
利用遗传算法求解优化,可以对非线性的函数求解优化,并且在以后的进一步对程序优化后,可以再广泛的生产和生活中得到运用。
所以在我们以后的学习中,可以把这一思想运用到那些生产生活中碰到的非线性问题。
关键词:Matlab;优化;遗传算法;非线性AbstractNow at an alarming rate of scientific and technological progress, by leaps and bounds can be used to describe it. What we learned in our professional courses, such as automatic control principle, modern control theory and other courses are generally said linear system. However, in real life, we have encountered can not be the linear system. Because in practice, there will always be a lot of uncertain factors that may affect the operation of the system, such as temperature, pressure, humidity and so on. Therefore, this paper is to examine the nonlinear function in the optimization of binding conditions.This article is in the Matlab environment, in the M documents through the preparation process to achieve the genetic algorithm, and then to find the optimal solution function. Therefore, the main procedures are to be completed M documents. Procedures for the preparation of one-dimensional function can be achieved, two-dimensional function optimization, and algorithm can be adopted in the process of drawing Matlab's plot function, images can be shown the same animation as before us.Through experiments, we can clearly see the process of algorithm. Calculation of one-dimensional function, the first generation in the range of randomly generated binding sites inn (the inn of the first generation of individuals), and then through a genetic algorithm as the core gn-generation algorithm, the final will focus on up to a point. The point is that the points required. Optimization algorithm for two-dimensional function of the principle and the principle of one-dimensional calculation is the same, but in drawing on more than one-dimensional point of difficulty.Optimize the use of genetic algorithm can solve the nonlinear optimization function, and in the future after further optimization of the process, can be a wide range of production and life use to be. Therefore, in our subsequent study, this idea can be applied to the production and life of those they encountered in nonlinear problems.Keywords: Matlab; Optimization; Genetic Algorithm; Nonlinear目录1 绪论 (1)1.1 研究背景及意义 (1)1.2 研究的内容 (2)1.3 本文的结构安排 (3)2 研究原理和工具介绍 (4)2.1 遗传算法的原理和应用 (4)2.1.1 遗传算法的定义和现状 (4)2.1.2 遗传算法的特点及应用 (6)2.1.3 遗传算法的应用步骤 (8)2.2 惩罚函数简介 (8)2.3 求解最优化问题的介绍和方法分类 (9)2.3.1 最优化问题及分类 (9)2.3.2 优化算法及分类 (10)2.4 Matlab的介绍和应用 (11)2.4.1 Matlab简介 (11)2.4.2 Matlab的应用 (11)3 算法的分析设计及部分程序说明 (14)3.1 算法的一维部分 (14)3.1.1 一维程序的分析与设计 (14)3.1.2 一维程序关键部分说明 (16)3.2 算法的二维部分 (19)3.2.1 二维程序的分析与设计 (19)3.2.2 二维程序关键部分说明 (19)4 运行结果及分析 (20)4.1 算法的一维部分 (20)4.1.1 直接运行结果 (20)4.1.2 参数修改运行对比 (23)4.2 算法的二维部分 (28)4.3 本章小结 (29)5 算法设计的优化 (30)5.1 已经完成的优化 (30)5.2 未来优化方向 (34)6 结束语 (36)参考文献 (37)致谢 (38)1 绪论1.1 研究背景及意义按照进化论的观点,地球上的每一物种从诞生开始就进去了漫长的进化过程,各种生物药生存下去就必须进行生存斗争,既有较强生存能力的生物个体容易存活下来并有较多的机会产生后代,反之则被淘汰,逐渐消亡。
1.整数规划的蒙特卡洛解法2015-06-10 (2)2. 罚函数法 2015-06-11 (3)3. 层次分析 2015-06-12 (4)4. 粒子群优化算法的寻优算法--非线性函数极值寻优 2015-06-13 (5)5有约束函数极值APSO寻优 2015-06-14 (12)6.模拟退火算法 TSP问题2015-06-15 (17)7. 右端步连续微分方程求解2015-06-16 (19)8. 多元方差分析 2015-06-17 (22)9. 基于MIV的神经网络变量筛选 2015-06-18 (25)10. RBF网络的回归--非线性函数回归的实现 2015-06-19 (29)11. 极限学习机在回归拟合中的应用 2015-06-20 (32)12. 极限学习机在分类中的应用 2015-06-21 (34)13. 基于PSO改进策略 2015-06-22 (37)14. 神经网络遗传算法函数极值寻优 2015-06-23 (46)1.1.整数规划的蒙特卡洛解法2015-06-10 已知非线性整数规划为:⎪⎪⎪⎩⎪⎪⎪⎨⎧≤++≤++≤++++≤++++=≤≤-----++++=200520062800622400)5,....,1(9902328243max 54233216432154321543212524232221x x x x x x x x x x x x x x x x i x x x x x x x x x x x z i如果用显枚举试探,共需要计算100^5=10^10个点,其计算量非常大。
然而应用蒙特卡洛去随机模拟计算10^6个点,便可以找到满意解,那么这种方法的可信度究竟怎么样呢? 下面就分析随机采样10^6个点计算时,应用概率理论估计下可信度。
不是一般性,假设一个整数规划的最优点不是孤立的奇点。
假设目标函数落在高值区的概率分别为0.01,0.00001,则当计算10^6个点后,有任一个点落在高值区的概率分别为:1-0.99^1000000=0.99...99(100多位) 1-0.99999^1000000=0.999954602解 (1)首先编写M 文件 mengte.m 定义目标函数f 和约束向量g,程序如下:function [f,g]=mengte(x);f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-... x(4)-2*x(5); g=[sum(x)-400x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800 2*x(1)+x(2)+6*x(3)-200 x(3)*x(3)+x(4)+5*x(5)-200];(2)编写M 文件mainint.m 如下求问题的解: rand('state',sum(clock)); p0=0; ticfor i=1:10^5x=99*rand(5,1);x1=floor(x);%向下取整 x2=ceil(x);%向上取整 [f,g]=mengte(x1); if sum(g<=0)==4 if p0<=f x0=x1; p0=f; end end[f,g]=mengte(x2); if sum(g<=0)==4 if p0<=fx0=x2; p0=f; end end end x0,p0Matlab 求解整数规划祥见第二章(优秀教材)2.罚函数法 2015-06-11利用罚函数法,可将非线性规划问题的求解,转化为求解一系列无约束极值问题,因而也称这种方法为系列无约束最小化技术,简记为SUMT 。
优化方法上机大作业学院:姓名:学号:指导老师:肖现涛第一题源程序如下:function zy_x = di1ti(x)%di1ti是用来求解优化作业第一题的函数。
x0=x; yimuxulong=0.000001;g0=g(x0);s0=-g0;A=2*ones(100,100);k=0;while k<100lanmed=-(g0)'*s0/(s0'*A*s0);x=x0+lanmed*s0;g=g(x);k=k+1;if norm(g)<yimuxulongzy_x=x;fprintf('After %d iterations,obtain the optimal solution.\n \n The optimal solution is \n %f.\n\nThe optimal "x" is "ans".',k,f(x) )break;endmiu=norm(g)^2/norm(g0)^2;s=-g+miu*s0;g0=g; s0=s;x0=x;endfunction f=f(x)f=(x'*ones(100,1))^2-x'*ones(100,1);function g=g(x)g=(2*x'*ones(100,1))*ones(100,1)-ones(100,1);代入x0,运行结果如下:>> x=zeros(100,1);>> di1ti(x)After 1 iterations,obtain the optimal solution.The optimal solution is-0.250000.The optimal "x" is "ans".ans =0.005*ones(100,1).第二题1.最速下降法。
MATLAB使用教程MATLAB是一种用于数据分析、算法开发和数值计算的强大工具。
它提供了一个交互式的环境,可以快速编写和调试代码,并且具有丰富的内置功能和工具箱。
本教程将介绍如何开始使用MATLAB,包括基本的语法、数据处理、图形绘制和函数编写等内容。
一、MATLAB的基本语法1.变量和赋值:在MATLAB中,可以使用等号(=)将一个值赋给一个变量。
例如,可以将一个数字赋给一个变量x。
x=52.矩阵和向量:MATLAB中的基本数据类型是矩阵和向量。
可以使用方括号([])来创建矩阵和向量。
例如,可以创建一个2x2的矩阵A和一个列向量b。
A=[12;34]b=[1;2]3.运算符:MATLAB支持标准的数学运算符,如加法、减法、乘法和除法。
还支持一些特殊的运算符,如幂运算、元素级乘法和矩阵乘法。
例如,可以计算两个矩阵的乘积。
C=A*b二、数据处理1. 定义函数:可以使用function关键字定义一个MATLAB函数。
例如,可以定义一个函数来计算两个数字的和。
function result = addNumbers(a, b)result = a + b;end2. 控制流程:可以使用if语句和for循环来控制程序的流程。
例如,可以编写一个程序来计算1到10的平方和。
sum = 0;for i = 1:10sum = sum + i^2;end三、图形绘制1. 绘制2D图形:可以使用plot函数来绘制2D曲线。
例如,可以绘制一个正弦曲线。
x = linspace(0, 2*pi, 100);y = sin(x);plot(x, y);2. 绘制3D图形:可以使用surf函数来绘制3D曲面图。
例如,可以绘制一个带有噪声的正弦曲面。
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);Z = sin(X) + cos(Y) + randn(size(X));surf(X, Y, Z);四、函数编写1.函数输入和输出:可以在函数定义中指定输入和输出参数。
[设计]罚函数法MATLAB程序
一、进退法、0.618法、Powell法、罚函数法的Matlab程序设计罚函数法(通用)
function y=ff(x,k)
y=-17.86*0.42*x(1)/(0.8+0.42*x(1))*(1-exp(-
2*(0.8+0.42*x(1))/3))*exp(-1.6)*x(2)-22.
99*x(1)/(0.8+x(1))*(1-exp(-2*(0.8+x(1))/3))*x(3)+k*(x(2)-
(1.22*10^2*(9517.8*exp(-1
.6-2*0.42*x(1)/3)*x(2)+19035.6*exp(-
2*x(1)/3)*x(3)))/(1.22*10^2+9517.8*exp(-1.6-2
*0.42*x(1)/3)*x(2)+19035.6*exp(-2*x(1)/3)*x(3)))^2+k*(x(3)-exp(-0.8-2*x(1)/3)*x(3)
-exp(-2.4-2*0.42*x(1)/3)*x(2))^2; % 主函数,参数包括未知数的个数n,惩罚因子q,惩罚因子增长系数k,初值x0,以及允许的误差r function G=FHS(x0,q,k,n,r,h,a) l=1;
while (l)
x=powell(x0,n,q,r(1),h,a); %调用powell函数
g(1)=ff1(x),g(2)=ff2(x) . . . g(p)=ffp(x); %调用不等式约束函数,将其值
%存入数组g
h(1)=hh1(x),h(2)=hh2(x) . . . h(t)=hht(x); %调用等式约束函数,将其值%存入数组h
for i=1:p
if g(i)<r
for j=1:t
if abs(h(j))<r(2)
continue;
else
break;
end
end
else
break;
end
end
if (i==p)&(j==t) %如果所有约束条件的值都在允许的范围内就结束 %搜索,否则加大惩罚力度继续搜索
l=0;
else
x0=x;
q=k*q;
end
end
G=x
%powell算法,用于寻找无约束最优值点
function powel=powell(x0,n,q,r,h,a)
d=eye(n); %n个线性无关的初始搜索方向
k=1;
kk=1;
xx(1,1:n)=x0;
while (kk)
y(1,1:n)=xx(k,1:n);
for j=1:n
s(j)=HJ(y(j,1:n),d(j,1:n),q); %调用0.618算法
y(j+1,1:n)=y(j,1:n)+s(j).*d(j,1:n);
end
d(n+1,1:n)=y(n+1,1:n)-y(1,1:n);
if (norm(d(n+1,1:n),2)<r)
kk=0;
break;
else
ww=0;
m=1;
for i=1:n
gg=ff(y(i,1:n),q)-ff(y(i+1,1:n),q);
if (gg>=ww)
m=i;
end
end
cha=ff(y(1,1:n),q)-2*ff(y(n+1,1:n),q)+ff(2*y(n+1,1:n)-y(1,1:n),q); cha1=2*(ff(y(m,1:n),q)-ff(y(m+1,1:n),q));
if (cha<cha1)
s(n+1)=HJ(y(n+1,1:n),h,a,d(n+1,1:n),q)
xx(k+1,1:2)=y(n+1,1:n)+s(n+1).*d(n+1,1:n)
for j=m+1:n
d(j,1:n)=d(j+1,1:n);
end
k=k+1;
else
xx(k+1,1:n)=y(n+1,1:n);
k=k+1;
end
end
end
powel=y(n+1,1:n)
function w=HJ(x0,h,d,dd,q) %0.618算法
[a,b]=JTF(x0,h,d,dd,q); %调用进退法算法,确定范围r=0.618;
r1=a+(1-r)*(b-a);
r2=a+r*(b-a);
y1=ff(x0+r1.*dd,q);
y2=ff(x0+r2.*dd,q);
k=1;
while (abs(r1-r2)>=0.1)
if y1<y2
b=r2;
r2=r1;
y2=y1;
r1=a+(1-r)*(b-a);
y1=ff(x0+r1.*dd,q);
else
a=r1;
r1=r2;
y1=y2;
r2=a+r*(b-a);
y2=ff(x0+r2.*dd,q);
end
end
w=(r1+r2)/2
%进退法
function [a,b]=JTF(x0,h,d,dd,q) r0=0;
y0=ff(x0+r0.*dd,q);
k=0;
l=1;
while (l)
r1=r0+h;
y1=ff(x0+r1.*dd,q);
if y1<y0
h=d*h;
r=r0;
r0=r1;
y0=y1;
else
if k==0;
h=-h;
r=r0;
else
l=0;
break;
end
end
k=k+1;
end
a=min(r,r1);
b=max(r,r1);
二、进退法、0.618法的C语言程序设计
例1 设f(x)=x^2-2*x+4 ,试确定初始搜索区间,并输出迭代次数main()
{int n=0;
float t,h,a,b,c,d,f1,f2;
printf(“t,h:”);
scanf(“%f,%f”,&t,&h);
f1=t*t-2*t+4;
if((t+h)*(t+h)-2*(t+h)+4<=f1) {c=t+h;f2=c*c-2*c+4;} else {h=-h;c=t+h; f2=c*c-2*c+4;} while(f2<=f1)
{h=2*h;d=t;t=c;f1=f2;c=t+h; f2=c*c-2*c+4;n=n+1;}
if(c<=d)
{a=c;b=d;}
else
{a=d;b=c;}
printf(“[a,b]=[%.2f,%f]\n”,a,b); printf(“n=%d\n”,n);
}
运行情况如下:
(1)t,h:0,0.05
[a,b]=[0.35,1.55]
n=4
(2) t,h:-1.0,0.02
[a,b]=[0.26,4.10]
n=7
(3)t,h:-100,0.01
[a,b]=[-59.05,63.83]
n=13
例2 用0.618法求f(x)=8x^3-2*x^2-7*x+3 的局部最优解(允许误差ε=0.0001 ,初始点
设为x0=0 ,初始步长h=1 (
#include“math.h”
float f(x)
float x;
float y;
{y=((8.0*x-2.0)*x-7.0)*x+3.0;
return(y);
}
main()
{int n=0;
float t,h,a,b,c,d,x0,f0,f1,f2,fc,fd;
printf(“t,h:”);
scanf(“%f,%f”,&t,&h);
f1=f(t);
if (f(t+h)<=f1)c=t+h;
else{h=-h;c=t+h;}
f2=f(c);
while(f2<=f1)
{d=t;t=c;f1=f2;c=t+h;f2=f(c);} if(c<=d){a=c;b=d;}
else{a=d;b=c;}
c=a+0.382*(b-a);fc=f(c);d=a+0.618*(b-a);fd=f(d);
do
{if (fc>=fd) {a=c;c=d;fc=fd;d=a+0.618*(b-a); fd=f(d);} else {b=d;d=c;fd=fc;c=a+0.382*(b-a);fc=f(c);}
n++;
}
while (b-a>0.0001);
x0=(a+b)/2.0;f0=f(x0);
pintf(“n=%d,x0=%7.4f,f0=%7.4f\n”,n,x0,f0); } 运行情况如下:
t,h:0,1.0
n=21,xo=0.6298,f0=-0.2034(。