黄金分割法编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• a=x2-0.618*(x2-x1); %用黄金分割法求出两个黄金分割点的值 • b=x1+0.618*(x2-x1); • k=0; • while (x2-x1)>=d %while条件循环 • f1=-sin(a)*cos(a) %计算黄金分割点对应的函数值 • f2=-sin(b)*cos(b) • if f1>f2 %if条件控制,对f1,f2大小进行比较 • x1=a; %满足条件,把a赋值给x1 • a=b; %把b赋值给a • b=x1+0.618*(x2-x1); %用黄金分割法计算新的b • elseif f1==f2
• 以下是对单谷函数求最小值做简单分析: • 具体步骤是:在区间[a,b]内取点:a1 ,a2 把[a,b]分为三段。 ① 如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+0.618*(b-a); ② 如果f(a1)<f(a2) ,令b=a2,a2=a1,a1=b-0.618*(b-a); ③如果f(a1)==f(a2),令a=a1,b=a2, a1=b-0.618*(b-a); a2=a+0.618*(b-a); (可分为两种情况,简化程序) 如果|(b-a)/b|和|(y1-y2)/y2|都大于收敛精度ε重新开始循环。 因为[a,b]为单谷或单峰区间,这样每次可将搜索区间缩小0.618倍, 处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间 上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到 满足预先给定的精度时,即获得一维优化问题的近似最优解 。
• • • • • • • • • • • • • •
x1=a; x2=b; a=x2-0.618*(x2-x1); b=x1+0.618*(x2-x1); else f1<f2 x2=b; b=a; a=x2-0.618*(x2-x1); end k=k+1 %迭代次数 end %迭代到满足条件就停止迭代 w=(x2+x1)/2; %计算平均值 fmin=-sin(w)*cos(w) %得出函数的极小值 &本程序可以直接用来求不同 x1,x2,d的最小值。
Golden section method
Golden section method
• Problem: • Minimize f(x)=-sin(x)*cos(x) • x=[40° ,50°] d=0.13° • (1)Program • (2)Example solution,report • (3)Discussion(discuss the any significant aspects of the problem,characteristics of golden section method,and your own understanding of project)
• 本题中需要注意的地方:1.度需要转化为弧度
• (3)讨论
• 黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于 另一部分与这部分之比。其比值是一个无理数,用分数表示为(√5-1)/2,取 其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此 称为黄金分割,也称为中外比。这个分割点就叫做黄金分割点。 • 黄金比例的求法如下: 设一条线段AB的长度为a,C点在靠近B点的黄金分割点上,且AC为b,则a 比b就是黄金数
(2)报告(结果):
运行程序得: • f1 = • -0.4996 • f2 = • -0.4996 • ans = • 1 • k = • 1 • f1 = • -0.4979 • f2 = • -0.4996 • k = • 2
•
f1 =
•
• • • • • •
-0.4996
f2 = -0.5000 k= 3 …… ……
•
• •
f2 =
-0.5000 k=
•
• •
10
fmin = -0.5000
函数图像:
• • • • • • • • • • • • •
运行程序后可以明显的看见函数的最小值fmin=-0.5000,迭代次数k=10 次和每次迭代循环过程中得出的f1,f2的值,并且画出函数图像用来和 计算得出的最小值做对照。 本题中if条件控制部分分了三部分,分别是f1>f2,f1<f2,f1==f2. 实际上f1==f2可以归纳到f1>f2,f1<f2中任意一个,如下 if f1>f2 %if条件控制,对f1,f2大小进行比较 x1=a; %满足条件,把a赋值给x1 a=b; %把b赋值给a b=x1+0.618*(x2-x1); %用黄金分割法计算新的b else f1<f2 x2=b; b=a; a=x2-0.618*(x2-x1); end 运行程序可以得到相同的结果
• (1)M文件程序:
• func百度文库ion fmin=gold(x1,x2,d) %建立函数文件 • d=0.13/180*pi; %将度转换为弧度 • x1=40/180*pi; • x2=50/180*pi; • x=x1:d:x2; • f=-sin(x).*cos(x); • plot(x,f,'r') %画出函数图形 • title('黄金分割法求函数最小值-1304卢贵兵') • xlabel('x') • ylabel('f') • axis tight
• 黄金分割法是用于一元函数f(x)在给定初始区间,[a,b] 内搜索极小点xmin的一种方法。它是优化计算中的经 典算法,以算法简单、收敛速度均匀、效果较好而著 称,是许多优化算法的基础,但它只适用于一维区间 上的单谷或单峰函数,即只在单谷或单峰区间内才能 进行一维寻优,其收敛效率较低。 • 其基本原理是:依照“去劣存优”原则、对称原则、 以及等比收缩原则来逐步缩小搜索区间。