优化设计黄金分割法实验报告
机械优化设计实验报告
一、实验目的本次实验旨在通过计算机编程,加深对机械优化设计方法的理解,掌握常用的优化算法,并能够利用计算机解决实际问题。
二、实验内容1. 黄金分割法(1)实验原理黄金分割法是一种常用的优化算法,适用于一元函数的极值求解。
其基本原理是:在给定初始区间内,通过迭代计算,逐步缩小搜索区间,直到满足收敛条件。
(2)实验步骤① 设计实验程序,实现黄金分割法的基本算法。
② 编写函数,用于计算一元函数的值。
③ 设置初始区间和收敛精度。
④ 迭代计算,更新搜索区间。
⑤ 判断是否满足收敛条件,若满足则输出结果,否则继续迭代。
(3)实验结果通过编程实现黄金分割法,求解函数f(x) = x^3 - 6x^2 + 9x + 1在区间[0, 10]内的极小值。
实验结果显示,该函数在区间[0, 10]内的极小值为1,且收敛精度达到0.001。
2. 牛顿法(1)实验原理牛顿法是一种求解非线性方程组的优化算法,其基本原理是:利用函数的导数信息,逐步逼近函数的极值点。
(2)实验步骤① 设计实验程序,实现牛顿法的基本算法。
② 编写函数,用于计算一元函数及其导数。
③ 设置初始值和收敛精度。
④ 迭代计算,更新函数的近似值。
⑤ 判断是否满足收敛条件,若满足则输出结果,否则继续迭代。
(3)实验结果通过编程实现牛顿法,求解函数f(x) = x^3 - 6x^2 + 9x + 1在区间[0, 10]内的极小值。
实验结果显示,该函数在区间[0, 10]内的极小值为1,且收敛精度达到0.001。
3. 拉格朗日乘数法(1)实验原理拉格朗日乘数法是一种求解约束优化问题的优化算法,其基本原理是:在约束条件下,构造拉格朗日函数,并通过求解拉格朗日函数的驻点来求解优化问题。
(2)实验步骤① 设计实验程序,实现拉格朗日乘数法的基本算法。
② 编写函数,用于计算目标函数、约束函数及其导数。
③ 设置初始值和收敛精度。
④ 迭代计算,更新拉格朗日乘数和约束变量的近似值。
优化设计黄金分割法实验报告
机械优化设计黄金分割法实验报告1、黄金分割法基本思路:黄金分割法适用于[a,b]区间上的任何单股函数求极小值问题,对函数除要求“单谷”外不做其他要求,甚至可以不连续。
因此,这种方法的适应面非常广。
黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b]内适当插入两点al,a2,并计算其函数值。
al,a2将区间分成三段,应用函数的单谷性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。
然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。
2黄金分割法的基本原理一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。
一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。
该方法用不变的区间缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实现起来比较容易,也易于人们所接受。
rl=a+O382(Js-a)r2=a+0,618(b-a)如图fi(r2)>f(rl)所以新区间为[迈以为新区间,继续求新的试点黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点**的一种方法。
它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数⑹,即只在单峰区间内才能进行一维寻优,其收敛效率较低。
其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间[7]。
具体步骤是:在区间[a,b]内取点:al,a2把[a,b]分为三段。
如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+r*(b-a);如果f(a1)<f(a2),令b=a2,a2=a1,a1=b-r*(b-a),如果|(b-a)/b|和|(y1-y2)/y2|都大于收敛精度e重新开始。
因为[a,b]为单峰区间,这样每次可将搜索区间缩小0.618倍或0.382倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。
最优化课程设计--黄金分割法及其算法实现(3
最优化课程设计--黄⾦分割法及其算法实现(3机械优化设计报告姓名:刘洋学号:S12080203054院系:机械⼯程学院专业:机械设计及理论2012年 12⽉ 4⽇摘要最优化理论和⽅法⽇益受到重视,已经渗透到⽣产、管理、商业、军事、决策等各个领域,⽽最优化模型与⽅法⼴泛应⽤于⼯业、农业、交通运输、商业、国防、建筑、同学、政府机关等各个部门及各个领域。
伴随着计算机技术的⾼速发展,最优化理论与⽅法的迅速进步为解决实际最优化问题的软件也在飞速发展。
其中,MATLAB软件已经成为最优化领域应⽤最⼴的软件之⼀。
有了MATLAB 这个强⼤的计算平台,既可以利⽤MATLAB优化⼯具箱(OptimizationToolbox)中的函数,⼜可以通过算法变成实现相应的最优化计算。
关键词:优化、黄⾦分割法、最速下降法、MATLAB、算法AbstractOptimization theory and methods and more attention, have penetrated into the production, management, business, military, decision-making and other fields, and optimization models and methods widely used in industry, agriculture, transportation, commerce, defense, construction, students, government various departments and agencies and other fields. With the rapid development of computer technology,optimization theory and methods for the rapid progress of the optimization problem to solve practical software is also developing rapidly. Which, MATLAB software has become the most optimization software is one of the most widely used. With this powerful computing platform MATLAB, either using MATLAB optimization toolbox (OptimizationToolbox) in the function, but also can achieve the appropriate algorithm to optimize into the calculation.Key words: Optimization、Golden section method、steepest descent method、MATLAB、algorithm⽬录摘要 (2)第⼀章绪论 (5)第⼆章黄⾦分割法的基本思想与原理 (6)2.1 黄⾦分割法的基本思路 (6)2.2 算法流程图 (7)2.3 ⽤matlab编写源程序 (7)2.4 黄⾦分割法应⽤举例 (8)第三章最速下降法的基本思想与原理 (9)3.1 最速下降法的基本思路 (9)3.2 算法流程图 (11)3.3 ⽤matlab编写源程序 (11)3.4 最速下降法应⽤举例 (13)第四章惩罚函数法的基本思想与原理 (13)4.1 惩罚函数法的基本思路 (13)4.2 算法流程图 (14)4.3 ⽤matlab编写源程序 (14)4.4 最速下降法应⽤举例 (16)第五章总结 (17)参考⽂献 (18)第1章绪论在⼈类活动中,要办好⼀件事(指规划、设计等),都期望得到最满意、最好的结果或效果。
优化设计理论-黄金分割法
xx = 43.8197 43.8197 43.8197 44.7214 44.7214 44.7214 44.9342 44.9342 44.9342 44.9845 44.9845 44.9845 44.9963 44.9963 44.9963 min_x = min =
50.0000 47.6393 46.1803 46.1803 45.6231 45.2786 45.2786 45.1471 45.0658 45.0658 45.0347 45.0155 45.0155 45.0082 45.0037 45.0059 -0.5000
-0.491 -0.492 -0.493 -0.494 -0.495 -0.496 -0.497 -0.498 -0.499 -0.5 40
41
Hale Waihona Puke 42434445
46
47
48
49
50
The second method :Golden Section Search:
clc,clear all ;format compact f=inline('-sin(x/360*2*pi).*cos(x/360*2*pi)','x') xx=[]; r=(sqrt(5)-1)/2; b=50;a=40; h = b-a; n=10; %构造一个空矩阵,方便输出 %r 为黄金分割点值 %n=10,10 次迭代 %区间宽度 第二次取:n=15
优化设计理论黄金分割法黄金分割率理论黄金分割理论黄金分割教案设计黄金分割黄金分割比例黄金分割点黄金分割线黄金分割比最优化理论与算法
机自 1101 班-20110401109-代洪庆 方法一:直接求解目标函数的最小值; 精度: =
[VIP专享]改进的黄金分割法
所以 f (x) 是凸函数。这个定理表明了根据局部导数的线性近似是函数的低 估,即凸函数图形位于图形上任一 点切线的上方。
根据这个定理,所以函数的最小值一定在切线的上方。利用凸函数的一阶特征 以及已知 的最小函数值就可以确定不确定区间。函数两个端点处的切线和最小函 数值的交点,即为缩 小的不确定区间。
所属课程名称 最优化
1) B2Ak+22+1=2+15+c51mc+=m5=21c11+m++12+2+1++=212=2+1+2+1+2+2+22+32k+1+2
实验项目名称 改进的黄所存在的缺点并对它进行改进。 3:熟悉应用 Matlab 求解无约束最优化问题的编程方法.
1) B2Ak+22+12=+15+c51mc+=5m=2c111++m+12+21+++2=12=2+1+2+1+2+2+22+32k+1+2
88.8918÷.12990.÷1=4214÷3922=.0034=1÷15251371=8.535.78208÷.0232173c0*0÷1=m920.30392.2c=1÷203m=2÷1202.52=3535=42314)c*5232m40341*.31252=3.*1.153.5*03134.2*920522..104455=+21*3*50202.2.0285.4850.13*50+5c8*125*12m0.2+050.+0*014.852*0051000+0+/038.T+0÷+=55*+1011+010+91÷0145405*00010200+5+0+080+40*04+***115.103910*-%*C%6(+÷*M==5M÷5)0*3*0(31÷3110**5*+*÷414.m2371e=%7)8n08%.=s8.5=77.93cc60.mc*m4*m13,101w9.9o.k24mc-.cem5nm2csp2665m*9..03-4.50c60*5.pc3m85,9cm0.5g.i50mr0l-.p.s85p/6c50bc.0om7m.yp.cs6pc5m+;c0m..m7.ckm; 1+1k+12+1+k2234=1c+m1++4+4+2
最优化方法三分法+黄金分割法+牛顿法
最优化⽅法三分法+黄⾦分割法+⽜顿法最优化_三等分法+黄⾦分割法+⽜顿法⼀、实验⽬的1. 掌握⼀维优化⽅法的集中算法;2. 编写三分法算法3. 编写黄⾦分割法算法4. 编写⽜顿法算法⼆、系统设计三分法1.编程思路:三分法⽤于求解单峰函数的最值。
对于单峰函数,在区间内⽤两个mid将区间分成三份,这样的查找算法称为三分查找,也就是三分法。
在区间[a,b]内部取n=2个内等分点,区间被分为n+1=3等分,区间长度缩短率=1 3 .各分点的坐标为x k=a+b−an+1⋅k (k=1,2) ,然后计算出x1,x2,⋯;y1,y2,⋯;找出y min=min{y k,k=1,2} ,新区间(a,b)⇐(x m−1,x m+1) .coding中,建⽴left,mid1,mid2,right四个变量⽤于计算,⽤新的结果赋值给旧区间即可。
2.算法描述function [left]=gridpoint(left,right,f)epsilon=1e-5; %给定误差范围while((left+epsilon)<right) %检查left,right区间精度margin=(right-left)/3; %将区间三等分,每⼩段长度=marginm1=left+margin; %left-m1-m2-right,三等分需要两个点m2=m1+margin; %m2=left+margin+marginif(f(m1)<=f(m2))right=m2; %离极值点越近,函数值越⼩(也有可能越⼤,视函数⽽定)。
else %当f(m1)>f(m2),m2离极值点更近。
缩⼩区间范围,逼近极值点left=m1; %所以令left=m1.endend %这是matlab的.m⽂件,不⽤写return.黄⾦分割法1.编程思路三分法进化版,区间长度缩短率≈0.618.在区间[a,b]上取两个内试探点,p i,q i要求满⾜下⾯两个条件:1.[a i,q i]与[p i,b i]的长度相同,即b i−p i=q i−a i;2.区间长度的缩短率相同,即b i+1−a i+1=t(b i−a i)]2.算法描述⾃⼰编写的:function [s,func_s,E]=my_golds(func,left,right,delta)tic%输⼊: func:⽬标函数,left,right:初始区间两个端点% delta:⾃变量的容许误差%输出: s,func_s:近似极⼩点和函数极⼩值% E=[ds,dfunc] ds,dfunc分别为s和dfunc的误差限%0.618法的改进形式:每次缩⼩区间时,同时⽐较两内点和两端点处的函数值。
机械优化设计VC6.0黄金分割法
i++;
if (y1>=y2)
{
a=a1;
a1=a2;
y1=y2;
a2=a+r*(b-a);
y2=f(a2);
}
else
{
b=a2;
a2=a1;
y2=y1;
a1=b-r*(b-a);
y1=f(a1);
}
q=(a+b)/2;
printf("%f\n",q);
}
a=(a+b)/2;
printf("迭代次数:%d\n",i);
题目:利用黄金分割法求 在 上的极小点。
利用VC++6.0进行编程,求得极小值点。具体程序如下说明。
一、求解原理:
黄金分割又称黄金律,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值为1∶0.618或1.618∶1,即长段为全段的0.618。0.618被公认为最具有审美意义的比例数字。上述比例是最能引起人的美感的比例,因此被称为黄金分割。
printf("得到的近似极小点:%f\n",a);
printf("相应的函数值:%f\n",f(a));
printf("**************************************************************************\n");
}
运行结果:
总结
综上所述,运用黄金分割法求得已知函数的极小值。使用VC++6.0实现编译,得到所要的结果。由运行结果证明程序编译正确。
{
黄金分割法试验报告
二,框图:
2
开始
给定 a, b, ε
λ ←0.618
a1←b-λ (b-α ) a2←b+λ (b-α )
y1←f(a1) y2←f(a2)
是 y1≧y2?
否
a←a1 a1←a2 y1←y2
b←a2 a2←a1 y2←y1
a2←a+λ (b-α ) y2←f(a2)
a1←b-λ (b-α ) y1←f(a1)
是
|
ba |<ε b
和|
y1 y 2 |<ε y2
否
a3←
1 (a+b) 2
3
结束
三,程序: #include<stdio.h> #include<math.h> #define E 1e-3 int main() { double a=-3.0,b=5.0,y=0.618; int N=0; double a1,a2,y1,y2,a3; a1=b-y*(b-a); a2=a+y*(b-a); y1=a1*a1+2*a1; y2=a2*a2+2*a2; while(1) { N++; printf("第%d 次迭代\t",N); if(y1>=y2) { a=a1; a1=a2; y1=y2; a2=a+y*(b-a); y2=a2*a2+2*a2; printf("a=%.3lf\t a1=.3lf%\t a2=%.3lf\t b=%.3lf\t y1=.3lf%\t y2=.3lf%\t\n",a,a1,a2,b,y1,y2); } else { b=a2; a2=a1; y2=y1; a1=b-y*(b-a); y1=a1*a1+2*a1; printf("a=%.3lf\t a1=%.3lf\t a2=%.3lf\t b=%.3lf\t y1=%.3lf\t y2=%.3lf\t\n",a,a1,a2,b,y1,y2); } if((fabs((b-a)/b)<E)&&(fabs((y2-y1)/y2)<E)) { a3=(a+b)/2; printf("迭代终止最后精确值 a3=%.3lf\t f(a3)=%.3lf\n",a3,a3*a3+2*a3); break; } else continue; } return 0; }
基于MATLAB的黄金分割法的优化设计
机械 优化设 计 主要包括 建立 优化 设计 问 题 的数 学模 型和选 择恰 当的优化 方法 与程序 两 方面 的内 容 。 由于 机 械优 化设 计是 运 用数 学 方法 寻求 机械 设计 的 最优 方案 , 以 研究 所 机械优 化 设计 问题 首先要 根据实 际机械 设计 问题建立 相应 的数学模 型l 在 建立数学 模型 】 1 。 时 , 使得 某项 机械 设 计在 各种 设计 限制条 要 件下 , 确立 各设计变 量之 间的相互 关系 , 然后 使 用计算 机 程序 优选 设 计参 数 , 使某 项 或几 项设 计指 标获 得最 优值 。 j 求解优化问题可以用解析解法和数值解法, 在很 多情况下 , 机械优化设计问题 限制条件 比较 多, 与之对应的数学描述也比较 复杂 , 不便于甚
() 1可在给定的任意精度下搜索 出逼近全局 的最 优 解 。 () 2 传统数 值法所 共有的要求 是需要 大量 的计算机 内存 , 而黄金分割法克服 了这个缺点 。
( ) 立求 解极 小值 点的M文件 ( od 2建 g lm i I : n. n)
ce r;l la c c a 3; -5;oe a c l 2; -0;- 1 0; b t lr n e e n i 0
1 黄 金分 割法 的搜索 过程 2 黄 金 分割 法要 求 插 入 点 a a 的 位 置 、 相 对 于 区 间 [b两 端 点具 有 对 称 性 , a 】 , 即在 给 定 区 间 【 b 内取 点 a】 1 a = b 0—a , 一』b )
,1 、
f k化 设 计 黄 金 分 割 法 MA I A 中图分类号 : t TI1 2 文献标 识 码 : A
文 章 编 号 : 7 —0 x( 0 0 1 () 0 6 0 1 4 9 6 8 2 1 ) b一0 9 - I 2
黄金分割法机械优化设计
黄金分割法机械优化设计在现代工程设计领域,机械优化设计是一项非常重要的任务。
通过对机械系统进行分析和优化,可以提高其性能和效率,节约资源并延长使用寿命。
黄金分割法是一种常用的优化设计方法,它基于黄金分割比的原理,通过寻找最佳设计参数来改进机械系统的性能。
本文将介绍黄金分割法机械优化设计的原理、方法和应用。
一、黄金分割法的原理黄金分割法源自于数学中的黄金分割比,即0.618,也称为费波那契数。
它是指将一条线段分割为两部分,使较长部分与整体的长度之比等于较短部分与较长部分之比。
黄金分割法的原理是将这一比例应用于机械设计中,以找到最佳的设计参数。
二、黄金分割法机械优化设计的方法1. 确定优化目标:在机械优化设计中,首先需要明确具体的优化目标。
比如,改善机械系统的运行效率、减少能源消耗或提高产品质量等。
2. 确定设计参数:根据机械系统的特性和优化目标,确定需要进行优化的设计参数。
这些参数可以是机械结构的尺寸、材料的选择或运行参数等。
3. 建立优化模型:根据设计参数,建立机械系统的优化模型。
模型可以是数学模型、仿真模型或实验模型,根据具体情况选择。
4. 寻找最佳设计参数:利用黄金分割法进行参数优化。
通过分割设计参数范围,并根据黄金分割比的原理,逐步缩小搜索范围,最终找到最佳设计参数。
5. 评估和验证:对优化得到的设计参数进行评估和验证。
可以通过数值模拟、物理实验或现场测试等方法,验证优化结果是否满足设计要求。
三、黄金分割法机械优化设计的应用黄金分割法机械优化设计在各行业都有广泛的应用。
以下为几个常见的应用领域:1. 机械结构设计:对于机械结构的设计优化,黄金分割法可以帮助确定最佳的尺寸比例,提高结构的刚性和稳定性。
2. 流体力学设计:在流体力学设计中,黄金分割法可以通过优化设计参数,改善流体的流动性能,提高流体的传输效率和混合效果。
3. 电子电路设计:黄金分割法可以应用于电子电路设计中,通过优化电路元件的参数和布局来提高电路的性能和稳定性。
0.618法
《数值优化》实验报告实验[1] [0.618法]专业学号姓名日期1 实验目的练习matlab程序设计,用精确线搜索,求目标函数在给定区间的极小值问题2 实验内容利用程序求解极小值问题[ s ,phis, k, G, E]=golds(inline(‘s^2-sin(s)’),0,1,1e-4,1e-5)3 算法设计0.618法也称黄金分割法,其基本思想是通过试探点函数值得比较,使得包含极小值的区间不断缩小。
输入:phi是目标函数,a,b是搜素区间的两个端点Delta,epsilon 分别是自变量和函数值得容许误差输出:是,phis分别是近似极小点和极小值,G是n*4矩阵其第k行分别是a,p,q,b的第k次迭代值E=[ds,dphi]分别是s和phis的误差线4 程序代码function [s,phis,k,G,E]=golds(phi,a,b,delta,epsilon)t=(sqrt(5)-1)/2; h=b-a;phia=feval(phi,a); phib=feval(phi,b);p=a+(1-t)*h; q=a+t*h;phip=feval(phi,p); phiq=feval(phi,q);k=1; G(k,:)=[a, p, q, b];while(abs(phib-phia)>epsilon)|(h>delta)if(phip<phiq)b=q; phib=phiq; q=p; phiq=phip;h=b-a; p=a+(1-t)*h; phip=feval(phi,p);elsea=p; phia=phip; p=q; phip=phiq;h=b-a; q=a+t*h; phiq=feval(phi,q);endk=k+1; G(k,:)=[a, p, q, b];endds=abs(b-a); dphi=abs(phib-phia);if(phip<=phiq)s=p; phis=phip;elses=q; phis=phiq;endE=[ds,dphi];5 运行结果[ s ,phis, k, G, E]=golds(inline(‘s^2-sin(s)’),0,1,1e-4,1e-5)6 结果分析0.618法计算起来逻辑简单仅需要计算函数值,适用范围广,使用方便,但是任何事都是利弊共存的,0.618法计算效率不高,需要大量的计算,而且只是线性收敛。
机械优化实验报告
一、实验目的本次实验旨在加深对机械优化设计方法的基本理论和算法步骤的理解,培养学生独立编制、调试计算机程序的能力,并掌握常用优化方法程序的使用方法。
通过实验,学生能够灵活运用优化设计方法解决工程实际问题。
二、实验内容本次实验主要涉及以下内容:1. 优化方法的基本原理2. 编程实现优化方法3. 优化方法的实际应用三、实验步骤1. 黄金分割法(1)基本原理黄金分割法是一种在给定初始区间内搜索极小点的一维搜索方法。
其基本原理是:在区间内取两个点,根据函数值的比较,将区间分为三段,保留包含极小值的段,再进行相同的操作,逐步缩小搜索区间。
(2)编程实现根据黄金分割法的基本原理,编写相应的C语言程序,实现一维搜索。
```c#include <stdio.h>#include <math.h>double f(double x) {// 定义目标函数return x x - 4 x + 4;}double golden_section_search(double a, double b, double tol) {double r = 0.618;double a1 = a + r (b - a); double a2 = b - r (b - a); double fa1 = f(a1);double fa2 = f(a2);while (fabs(b - a) > tol) { if (fa1 > fa2) {a = a1;a1 = a2;a2 = b - r (b - a); fa1 = fa2;fa2 = f(a2);} else {b = a2;a2 = a1;a1 = a + r (b - a); fa2 = fa1;fa1 = f(a1);}}return (a + b) / 2;}int main() {double x_min = golden_section_search(a, b, tol);printf("Optimal solution: x = %f\n", x_min);return 0;}```(3)结果分析通过运行程序,可以得到最优解 x = 2.000000,目标函数值为 f(x) = 0。
实验二 黄金分割法实验指导书
实验二黄金分割法实验指导书一、实验目的:1、加深对黄金分割法的基本理论和算法步骤的理解。
2、培养学生独立编制、调试机械优化算法程序的能力。
3、培养学生灵活运用优化设计方法解决工程实际问题的能力。
二、主要设备及软件配置硬件:计算机(1台/人)软件:VC6.0(c++)三、算法程序框图及算法步骤图1-2 黄金分割法程序框图算法程序框图:如图1-2所示。
算法步骤:1)给出初始搜索区间[a,b]及收敛精度ε,将λ赋以0.618。
2)按坐标点计算公式计算a1,a2;并计算其对应的函数值y1,y2。
3)根据区间消去法原理缩短搜索区间。
为了能用原来的坐标点计算公式,需进行区间名称的代换,并在保留区间中计算一个新的试验点及其函数值。
如果y1≥y2,则新区间=[a1 b],a=a1,a1=a2,y1=y2,插入新点a2=a+λ*(b-a) ,y2=f(a2);如果y1<y2,则新区间=[a a2],b=a2,a2=a1,y2=y1插入新点a1=b-λ*(b-a) ,y1=f(a1);4)检查区间是否缩短到足够小和函数值收敛到足够精度,如果收敛条件满足,则取最后两试验点的平均值作为极小点的数值近似解。
如果条件不满足则转向步骤3)进行新的区间缩小。
四、实验内容与结果分析1、根据算法程序框图和算法步骤编写计算机程序;2、求解函数f(x)=x+20/x的极小点,初始搜索区间为[0.2,1], 收敛精度ε=0.01;3、如果初始搜索区间为[0.1,10],收敛精度ε=0.001,结果又如何?4、试分析初始搜索区间和收敛精度对搜索计算的影响。
附录:黄金分割法源程序#include <stdio.h>#include <conio.h>#include <math.h>#include <iostream.h>#define e 0.001#define tt 0.01float function(float x){// float y=xa*pow(x,3)-b*pow(x,2)-c*x+d; //求解的一维函数float y=1*pow(x,4)-5*pow(x,3)-4*pow(x,2)-6*x+60; //求解的一维函数return(y);}void finding(float a[3], float f[3]){float t=tt,a1,f1,ia;//初始区间的下界值a[0]=0;f[0]=function(a[0]);for (int i=0;;i++){a[1]=a[0]+t; f[1]=function(a[1]);if ((f[1]<f[0])) break;if ((fabs(f[1]-f[0])>=e)){t=-t;a[0]=a[1];f[0]=f[1];}else{if (ia==1) return;t=t/2;ia=1;}}for (i=0;;i++){a[2]=a[1]+t; f[2]=function(a[2]);if(f[2]>f[1]) break;t=2*t;a[0]=a[1];f[0]=f[1];a[1]=a[2];f[1]=f[2];}if (a[0]>a[2]){a1=a[0]; f1=f[0];a[0]=a[2]; f[0]=f[2];a[2]=a1; f[2]=f1;}return;}float gold(float *ff){float a1[3],f1[3],a[4],f[4];float aa;finding (a1,f1);a[0]=a1[0]; f[0]=f1[0];a[3]=a1[2]; f[3]=f1[2];a[1]=a[0]+0.382*(a[3]-a[0]); a[2]=a[0]+0.618*(a[3]-a[0]);f[1]=function(a[1]); f[2]=function(a[2]);for (int i=0;;i++){if (f[1]>=f[2]){a[0]=a[1]; f[0]=f[1];a[1]=a[2]; f[1]=f[2];a[2]=a[0]+0.618*(a[3]-a[0]); f[2]=function(a[2]);}else{a[3]=a[2]; f[3]=f[2];a[2]=a[1]; f[2]=f[1];a[1]=a[0]+0.382*(a[3]-a[0]); f[1]=function(a[1]);}if ((a[3]-a[0]<e)){aa=(a[1]+a[2])/2; *ff=function(aa);break;}}return(aa);}void main(){// TODO: Add extra validation herefloat xx,ff;xx=gold(&ff);cout<<"极值点X="<<xx<<endl;cout<<"极值y="<<ff<<endl;#include <stdio.h>#include <conio.h>#include <math.h>#include <iostream.h> #define e 0.001#define tt 0.01float function(float x){// float y=xa*pow(x,3)-b*pow(x,2)-c*x+d; //求解的一维函数 float y=(x+1)*1*pow(x-2,2); //求解的一维函数return(y);}void finding(float a[3], float f[3]){float t=tt,a1,f1,ia;//初始区间的下界值a[0]=0;f[0]=function(a[0]);for (int i=0;;i++){a[1]=a[0]+t; f[1]=function(a[1]);if ((f[1]<f[0])) break;if ((fabs(f[1]-f[0])>=e)){t=-t;a[0]=a[1];f[0]=f[1];}else{if (ia==1) return;t=t/2;ia=1;}}for (i=0;;i++){a[2]=a[1]+t; f[2]=function(a[2]);if(f[2]>f[1]) break;t=2*t;a[0]=a[1];f[0]=f[1];a[1]=a[2];f[1]=f[2];}if (a[0]>a[2]){a1=a[0]; f1=f[0];a[0]=a[2]; f[0]=f[2];a[2]=a1; f[2]=f1;}return;}float gold(float *ff){float a1[3],f1[3],a[4],f[4];float aa;finding (a1,f1);a[0]=a1[0]; f[0]=f1[0];a[3]=a1[2]; f[3]=f1[2];a[1]=a[0]+0.382*(a[3]-a[0]); a[2]=a[0]+0.618*(a[3]-a[0]); f[1]=function(a[1]); f[2]=function(a[2]);for (int i=0;;i++){if (f[1]>=f[2]){a[0]=a[1]; f[0]=f[1];a[1]=a[2]; f[1]=f[2];a[2]=a[0]+0.618*(a[3]-a[0]); f[2]=function(a[2]);}else{a[3]=a[2]; f[3]=f[2];a[2]=a[1]; f[2]=f[1];a[1]=a[0]+0.382*(a[3]-a[0]); f[1]=function(a[1]);}if ((a[3]-a[0]<e)){aa=(a[1]+a[2])/2; *ff=function(aa);break;}}return(aa);}void main(){// TODO: Add extra validation herefloat xx,ff;xx=gold(&ff);cout<<"极值点X="<<xx<<endl;cout<<"极值y="<<ff<<endl;}。
中北大学最优化实验报告
中北大学实验报告课程名:最优化方法任课教师:李卉专业:数学与应用数学学号:14080141姓名:2015/2016学年第2学期中北大学理学院《最优化方法》课程实验 第1次实验报告一、实验内容及基本要求实验项目名称:黄金分割法程序设计实验类型:设计型每组人数:1实验内容及要求:内容:能够应用MATLAB 或C++设计黄金分割法的程序,并用实例进行验证要求:能够独立完成程序的设计及验证二、实验题目利用黄金分割法求函数()232tan x x x φ=-在[]0,1上的极小点。
取容许误差410ε-=,510δ-=三、实验步骤及结果1)、建立y 函数M 文件(fun_gs.m )function y= fun_gs(x)y=3*x^2-2*tan(x);end2)、建立求解极小值点的M 文件(Untitled5.m )function gs(x)a=0;b=1;eps=0.0001;i=100;a1=b-0.618*(b-a);a2=a+0.618*(b-a);y1=fun_gs(a1);y2=fun_gs(a2);for k=1:i;if (abs(b-a)<=eps)y=fun_gs((b+a)/2);break;elseif (y1<=y2)y2=fun_gs(a1);b=a2;a2=a1;a1=b-0.618*(b-a);y1=fun_gs(a1);elsey1=fun_gs(a2);a=a1;a1=a2;a2=a+0.618*(b-a);y2=fun_gs(a2);endi=i+1;endendia0=(b+a)/2y=fun_gs((b+a)/2)end实验结果:根据实验结果可知:迭代次数i =120 ,极小值点a0 =0.3895 ,在极小点处的函数值为y =-0.3658.《最优化方法》课程实验 第2次实验报告一、实验内容及基本要求实验项目名称:牛顿法程序设计实验类型:设计型每组人数:1实验内容及要求:内容:能够应用MATLAB 或C++设计牛顿法的程序,并用实例进行验证要求:能够独立完成程序的设计及验证二、实验题目利用牛顿法程序求解()()()2222121min 431x R f x x x x ∈=-+-该问题有精确解()()1,1,0T x f x **==。
实验报告黄金分割
太原理工大学机械学院机测系课程上机实验报告课程名称:机械优化设计班级日期成绩评定姓名实验室老师签名实验名称用黄金分割法程序解题所用软件C++ DEV实验目的及内容实验目的:1.掌握并能够建立最优化基本类型问题的数学模型。
2.掌握最优化方法的基本概念、基本理论和基本方法,奠定最优化的理论基础。
3.能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基础实验内容:理解黄金分割法并编写相关程序求其最优解。
实验原理:实验原理步骤、实验步骤:1,画流程图,编写程序;2,将目标函数代入;3,编译运行,将结果保存实验结果及分析**********黄金分割法计算结果**********缩短次数 a b a(1) a(2) f1 f2 b-a0, 2.00000000, 8.00000000, 4.29200000, 5.70800000, -1.62273600, 2.62526400, 6.000000001, 2.00000000, 5.70800000, 3.41645600, 4.29200000, -2.24302040, -1.62273600, 3.708000002, 2.00000000, 4.29200000, 2.87554400, 3.41645600, -1.86005470, -2.24302040, 2.292000003, 2.87554400, 4.29200000, 3.41645600, 3.75091381, -2.24302040, -2.18704226, 1.416456004, 2.87554400, 3.75091381, 3.20993527, 3.41645600, -2.16586245, -2.24302040, 0.875369815, 3.20993527, 3.75091381, 3.41645600, 3.54426001, -2.24302040, -2.24804105, 0.540978546, 3.41645600, 3.75091381, 3.54426001, 3.62315093, -2.24804105, -2.23483385, 0.334457817, 3.41645600, 3.62315093, 3.49541346, 3.54426001, -2.24997896, -2.24804105, 0.206694938, 3.41645600, 3.54426001, 3.46527713, 3.49541346, -2.24879432, -2.24997896, 0.127804019, 3.46527713, 3.54426001, 3.49541346, 3.51408855, -2.24997896, -2.24980151, 0.0789828810, 3.46527713, 3.51408855, 3.48392309, 3.49541346, -2.24974153, -2.24997896, 0.0488114211, 3.48392309, 3.51408855, 3.49541346, 3.50256534, -2.24997896, -2.24999342, 0.0301654612, 3.49541346, 3.51408855, 3.50256534, 3.50695466, -2.24999342, -2.24995163, 0.0186750913, 3.49541346, 3.50695466, 3.49982220, 3.50256534, -2.24999997, -2.24999342, 0.0115412014, 3.49541346, 3.50256534, 3.49814548, 3.49982220, -2.24999656, -2.24999997, 0.0071518815, 3.49814548, 3.50256534, 3.49982220, 3.50087696, -2.24999997, -2.24999923, 0.0044198616, 3.49814548, 3.50087696, 3.49918890, 3.49982220, -2.24999934, -2.24999997, 0.0027314817, 3.49918890, 3.50087696, 3.49982220, 3.50023212, -2.24999997, -2.24999995, 0.0016880518, 3.49918890, 3.50023212, 3.49958741, 3.49982220, -2.24999983, -2.24999997, 0.0010432219, 3.49958741, 3.50023212, 3.49982220, 3.49998584, -2.24999997, -2.25000000, 0.0006447120, 3.49982220, 3.50023212, 3.49998584,3.50007553, -2.25000000, -2.24999999, 0.0004099221, 3.49982220, 3.50007553, 3.49991897, 3.49998584, -2.24999999, -2.25000000, 0.0002533322, 3.49991897, 3.50007553, 3.49998584, 3.50001573, -2.25000000, -2.25000000, 0.0001565623, 3.49991897, 3.50001573, 3.49995593, 3.49998584, -2.25000000, -2.25000000, 0.0000967524, 3.49995593, 3.50001573, 3.49998584, 3.49999288, -2.25000000, -2.25000000, 0.0000597925, 3.49998584, 3.50001573, 3.49999288, 3.50000431, -2.25000000, -2.25000000, 0.0000298826, 3.49999288, 3.50001573, 3.50000431, 3.50000700, -2.25000000, -2.25000000, 0.0000228427, 3.49999288, 3.50000700, 3.49999828, 3.50000431, -2.25000000, -2.25000000, 0.0000141228, 3.49999288, 3.50000431, 3.49999725, 3.49999828, -2.25000000, -2.25000000, 0.0000114329, 3.49999725, 3.50000431, 3.49999828, 3.50000161, -2.25000000, -2.25000000, 0.0000070630, 3.49999828, 3.50000431, 3.50000161, 3.50000201, -2.25000000, -2.25000000, 0.0000060331, 3.49999828, 3.50000201, 3.49999970, 3.50000161, -2.25000000, -2.25000000, 0.0000037332, 3.49999828, 3.50000161, 3.49999955, 3.49999970, -2.25000000, -2.25000000, 0.0000033433, 3.49999955, 3.50000161, 3.49999970, 3.50000083, -2.25000000, -2.25000000, 0.0000020634, 3.49999955, 3.50000083, 3.50000004, 3.49999970, -2.25000000, -2.25000000, 0.0000012735, 3.49999955, 3.49999970, 3.49999961, 3.50000004, -2.25000000, -2.25000000, 0.00000015*********************黄金分割法最优点及目标函数值为:x( *)=[ 3.4999996], f( *)= -2.2500000迭代精度:0.000000150算法程序实现/*csssqj.cpp */#include <string.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include <time.h>#define N 1 /*优化设计维数*/#define EPSIN 0.000001 /*迭代精度*/#define H_QJ 1.0 /*初始区间搜索步长*/FILE *fp;char outname[50]="黄金分割法计算结果.txt"; /*计算结果输出文件*//*给出初始点坐标*/void csd_x(double x0[]){int i;for(i=0;i<N;i++) /*初始点为坐标原点的情况*/x0[i]=0.0;return;}/*目标函数*/double hanshu(double x[]){double f;f=x[0]*x[0]-10.0*x[0]+36.0;return f;}/*计算f(xk+as)*/double xkadd(double x[],double d[],double a){int i;double x1[N];for(i=0;i<N;i++)x1[i]=x[i]+a*d[i];return hanshu(x1);}/*初始搜索区间的确定*/void csssqj(double x[],double d[],double h,double ab[]) {double a1,a2,a3,f1,f2,f3;a2=0.0;a3=a2+h;f2=xkadd(x,d,a2);f3=xkadd(x,d,a3);if(f3>f2){a2=a3;a3=0.0;f1=f2;f2=f3;f3=f1;h=-h;}do{a1=a2;a2=a3;f1=f2;f2=f3;a3=a2+h;f3=xkadd(x,d,a3);h=2*h;}while(f3<f2);if(h>0.0){ab[0]=a1;ab[1]=a3;}else{ab[0]=a3;ab[1]=a1;}return;}/*黄金分割法*/void goldcut(double x[],double d[],double h,double ebsin) {double a1,a2,f1,f2,a,b,ab[2];int i,k=0;fprintf(fp,"**********黄金分割法计算结果**********\n\n");fprintf(fp,"缩短次数 a b a(1) a(2)");fprintf(fp," f1 f2 b-a\n");csssqj(x,d,h,ab);a=ab[0];b=ab[1];a1=b-0.618*(b-a);f1=xkadd(x,d,a1);a2=a+0.618*(b-a);f2=xkadd(x,d,a2);fprintf(fp,"%3d,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf\n", k,a,b,a1,a2,f1,f2,b-a);do{if(f1>f2){a=a1;a1=a2;f1=f2;a2=a+0.618*(b-a);f2=xkadd(x,d,a2);}else{b=a2;a2=a1;f2=f1;a1=b-0.618*(b-a);f1=xkadd(x,d,a1);}k++;fprintf(fp,"%3d,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf\n", k,a,b,a1,a2,f1,f2,b-a);}while(b-a>ebsin);for(i=0;i<N;i++)x[i]+=(b+a)*d[i]/2;fprintf(fp,"\n*********************\n");fprintf(fp,"黄金分割法最优点及目标函数值为:\n");fprintf(fp," x( *)=[");for(i=0;i<N-1;i++)fprintf(fp,"%15.7lf,",x[i]);fprintf(fp,"%15.7lf],",x[N-1]);f1=hanshu(x);fprintf(fp," f( *)=%15.7lf\n",f1);fprintf(fp," 迭代精度:");fprintf(fp,"%15.9lf\n",b-a);return;}main(){double x0[N],h,ebsin,d[N];csd_x(x0);h=H_QJ;ebsin=EPSIN;d[0]=1.0;fp=fopen(outname,"w");goldcut(x0,d,h,ebsin);fclose(fp);return 0;}备注:不交此报告者,本次实验为“不合格”。
黄金分割法机械优化设计
机械优化设计黄金分割法班级:学硕一班学号:姓名:黄金分割法黄金分割法也成为0.618法,是一种应用广泛的一维搜索方法。
该方法对函数)(αf 无特殊要求,函数甚至可以是不连续的。
黄金分割法是利用序列消去原理,通过不断缩小单峰区间长度,使搜索区间不断缩小,从而不断逼近目标函数极小点的一种优化方法。
一、基本思想在搜索区间[a,b]内必须按下述规则对称地取1α和2α两点,使)(1a b b --=λα,)(2a b a -+=λα,这两点把区间分为三段,计算插入点的函数值,如图1-1所示。
根据单峰函数的性质,通过比较函数值大小,删去其中一段,使搜索区间缩小。
在新的区间继续上面的过程,使搜索区间不断缩小,当搜索区间无限缩小时,便可得到函数在极小点附近的近似解。
在第一次缩小区间后,新区间只需要再插入一点即可形成区间新三段。
按比例λ缩小,新区间三段与原区间三段具有相同的比例分布,每次缩小所得新区间长度与原区间长度之比成为区间收缩率λ。
图1-1设初始区间长度为L ,为了保证区间收缩率不变,第一次收缩后的长度为L λ,第二次收缩后的长度为)1(λ-L ,而第二次的收缩率应该相等。
)1()1(2λλλλλ-=→-=L L L解次方程并舍去负根,就可得到618.0215=-=λ。
所以,1α和2α两点的取法为:)(618.01a b b --=α,)(618.02a b a -+=α。
所以,对于黄金分割法,适用于设计变量少的优化问题中的一维搜索。
二、黄金分割法的搜索过程1)给出初始搜索区间及收敛精度,将λ赋以0.6182)按坐标点计算公式计算)()(618.0111ααf f a b b =--=,,)()(618.0222ααf f a b a =-+=,;并计算其对应的函数值。
3)根据区间消去法原理缩短搜索区间。
为了能用原来的坐标点计算公式,需进行区间名称的代换,并在保留区间中计算一个新的试验点及其函数值。
如果21f f <,则新区间=],[2αa令12122f f b ===,,ααα,记N0=0;如果21f f >,则新区间=],[1b α令21212f f a ===,,ααα,记N0=1;如图2-1所示。
机械优化设计黄金分割法实验报告
实验报告课程名称:机械优化设计实验项目:一维搜索(黄金分割)法上机实验专业班级: XXXXX级机械工程及自动化XX班学号: XXXXXXXXXX 姓名: XXXXXX 指导老师: XXXXXX 日期: 201X.12.12机械工程试验教学中心实验1 一维搜索(黄金分割)法实验报告实验日期 201X 年 12 月 11 日报告日期 201X 年 12 月 12 日班级 XXXXX级机自XXXX班姓名 XXXXXX 学号 XXXXXXXXXXXXXXX1、实验目的○1了解黄金分割法的基本原理;○2熟悉matlab程序使用方法;○3学习上机调试、运行所编写的程序。
2、黄金分割法原理该法适用于[a,b]区间上单谷函数极小值问题。
在搜索区间[a,b]内按照0.618比例加入两点α1,α2,并计算其函数值。
α1,α2将区间分成三段,然后利用区间消去法,通过比较函数值大小,删除其中一段,使搜索区间缩短,在保留区间进行同样处理,直到搜索区间缩小到指定精度为止。
3、编制MATLAB优化程序○1编写函数文件,并命名为fx.m保存,程序代码如下:function f=fx(w)%f=w^2-10*w+36;%f=w^4-5*w^3+4*w^2-6*w+60;%f=((w+1)^4)*((w-2)^2);注:上述“%”后面分别为要求解的三个方程,求解该方程式把相应方程式前面的“%”删除,点击保存,并运行下面的hjf.m文件,输入相应的初始步长h0、初始点x0、收敛法则epsilan的值○2编写进退法程序文件,命名为ab1.m保存,程序代码如下:function [a,b]=ab1(h0,x0)h=h0;x1=x0;f1=fx(x1);x2=x1+h;f2=fx(x2);if f2>f1h=-h;x3=x1;f3=f1;x1=x2;f1=f2;x2=x3;f2=f3;endx3=x2+h;f3=fx(x3);while f2>=f3x1=x2;f1=f2;x2=x3;f2=f3;x3=x2+2*h;f3=fx(x3);endif h<0a=x3;b=x1;elsea=x1;b=x3;end○3编写黄金分割法程序文件,命名为hjfgf.m 保存,程序代码如下: function hjfclearh1 = input('h0=?');x1=input('x0=?');epsilan=input('epsilan=?');[a,b]=ab1(h1,x1);x1=a+0.382*(b-a);f1=fx(x1);x2=a+0.618*(b-a);f2=fx(x2);while abs(b-a)>epsilanif f1>f2a=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);f2=fx(x2);elseb=x2;x2=x1;f2=f1;x1=a+0.382*(b-a);f1=fx(x1);endendxm=(a+b)/2;['Optimal result:',blanks(3),'xm=[',...num2str(xm),']',blanks(6),'fm=',num2str(fx(xm))]4、实验结果()3610min )12+-=t t t f结果: *t = 5.0001 =*f 11 (h0=0.3、x0=0、epsilan=0.001)()60645min )2234+-+-=t t t t t f结果: *t = 3.2795 =*f 22.659 (h0=0.3、x0=0、epsilan=0.001)()()()2421min )3-+=t t t f 结果: *t =__-0.99989__ =*f __1.4253e-015__ (h0=0.3、x0=0、epsilan=0.001)。
黄金分割法实验报告
实验一黄金分割法一、实验目的 1、加深对黄金分割法及其算法框图与步骤的理解。
2、培养学生独立编制、调试黄金分割法C语言程序的能力。
3、掌握常用优化方法程序的使用方法。
4、培养学生灵活运用优化设计方法解决实际工程问题的能力。
二、实验内容 1、编制调试黄金分割法C语言程序。
2、利用调试好的C语言程序进行实例计算。
3、根据实验结果写实验报告。
三、实验步骤 1、编制调制程序。
2、计算实例。
四、算法及框图 计算实例:被搜索函F(x)=x4-4x3-6x2-16x+4 步骤一:??matlab??⒉⒌?F(x)??兎?ㄅ?⒉?枽??ⅴ??洛?ㄞ?扟嫛兢????? 步骤二:???????侱?梃[x1,x2]; 步骤三:??煓摠⒕━??⒉??屲*p ①外推法部分的程序框图 ②黄金分割法部分的程序框图 ③外推法与黄金分割法合起来后的总程序 #include <stdio.h>#include <math.h>#define e 0.00001 /*设定黄金分割的精度值为为e=0.00001*/#define tt 0.00000001 /*设置外推法的最初步长为h=0.00000001*/float f(double x) /*定义被搜索函数f(x)*/{float y=pow(x,4)-4*pow(x,3)-6*pow(x,2)-16*x+4;return(y); /*返回函数计算值f(x)*/}finding(float *p1,float*p2) /*使用指针方式定义确定搜索区间的外推法函数finding( ) */{float x1=0,x2,x3,t,f1,f2,f3,h=tt;int n=0;x2=x1+h;f1=f(x1);f2=f(x2);if(f2>f1) {h=-h;t=x2;x2=x1;x1=t;} /*若f2>f1,则反向搜索*/x3=x2+h;while(f(x3)<f(x2)){ h=2*h;x1=x2;f1=f(x2);x2=x3;f2=f(x3);x3=x2+h;n=n+1;}if(x1>x3){t=x1;x1=x3;x3=t;}*p1=x1;*p2=x3; /*利用指针*p1、*p2向主函数返回搜索区间的始点a、终点b的值,即a=*p1=x1,b=*p2=x2 */return(n); /*向主函数返回使用外推法时的循环次数n */}gold(float *p) /*使用指针方式定义确定最小值点的黄金分割函数gold( ) */{float a,b,x1,x2,f1,f2;int n=0;finding(&a,&b); /*利用指针的方式,通过函数finding( )确定确定搜索区间的始点a、终点b 的值*/do{x1=a+0.382*(b-a);x2=a+0.618*(b-a);f1=f(x1);f2=f(x2);n=n+1;if(f1>f2) a=x1;else b=x2;}while((b-a)>e); /*通过黄金分割的方法缩小最优点所在的区间直到满足精度要求e为止*/*p=(a+b)/2; /*取最小区间的中点作为极小值点的数值*p */return(n); /*返回使用黄金分割法时迭代的次数n */}void main() /*主函数部分*/{float a,b,x,min;int n1,n2;n1=finding(&a,&b); /*利用指针方式,通过调用确定搜索区间的外推法函数finding( ),确定搜索区间的始点a、终点b的值,并确定使用外推法时的循环次数n1*/n2=gold(&x); /*利用指针方式,通过调用黄金分割函数gold( ),确定极小值点的数值x,并确定使用黄金分割法时迭代的次数n2*/min=f(x); /*通过调用被搜索函数f(),计算最小点的函数值min */printf("\n 被搜索函数是F(x)=x^4-4x^3-6x^2-16x+4,精度为e=0.00001");printf("\n 利用外推法确定的搜索区间是: [%f, %f]",a,b);printf("\n 用外推法确定搜索区间时的循环次数是: n1=%d 次",n1);printf("\n 在搜索区间内使用黄金分割法的迭代次数是: n2=%d 次",n2);printf("\n 产生极小值点是在: x=%f 处,并且极小值是: F(%f)=%f",x,x,min);printf("\n");} 程序运行结果: 五、实验结果分析: 从上面的程序运行结果和利用Matlab解出的结果相比较,利用外推法和黄金分割法求函数的最优解可以达到很高的精度值,和精确解的误差相差很小,并且这种方法对函数除要求“单谷”外不做其他要求,而且函数可以不连续,因此,该方法的适应面相当广。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机械优化设计黄金分割法实验报告
1、黄金分割法基本思路:
黄金分割法适用于[a,b]区间上的任何单股函数求极小值问题,对函数除要求“单谷”外不做其他要求,甚至可以不连续。
因此,这种方法的适应面非常广。
黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b]内适当插入两点a1,a2,并计算其函数值。
a1,a2将区间分成三段,应用函数的单谷性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。
然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。
2 黄金分割法的基本原理
一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。
一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。
该方法用不变的区间缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实现起来比较容易,也易于人们所接受。
黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点α*的一种方法。
它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数[6],即只在单峰区间内才能进行一维寻优,其收敛效率较低。
其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间[7]。
具体步骤是:在区间[a,b]内取点:a1 ,a2 把[a,b]分为三段。
如果f(a1)>f(a2),令
a=a1,a1=a2,a2=a+r*(b-a);如果f(a1)<f(a2) ,令b=a2,
a2=a1,a1=b-r*(b-a),如果|(b-a)/b|和|(y1-y2)/y2|都大于收
敛精度ε重新开始。
因为[a,b]为单峰区间,这样每次可将搜索区间缩小0.618倍或0.382倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。
黄金分割法原理如图1所示,
3 程序流程如下:
4 实验所编程序框图
开始
#include 《math.h》
#include 《stdio.h》
#define f(x) x*x+2*x
double calc(double *a,double *b,double e,int *n) { double x1,x2,s;
if(fabs(*b-*a)<=e)
s=f((*b+*a)/2);
else
{ x1=*b-0.618*(*b-*a);
x2=*a+0.618*(*b-*a);
if(f(x1)>f(x2))
*a=x1;
else
*b=x2;
*n=*n+1;
s=calc(a,b,e,n);
}
return s;
}
main()
{ double s,a,b,e;
int n=0;
scanf("%lf %lf %lf",&a,&b,&e);
s=calc(&a,&b,e,&n);
printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n); }
5 程序运行结果如下图:。