黄金分割法编程

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 本题中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);
a2=a+0.618*(b-a); (可分为两种情况,简化程序)
如果|(b-a)/b|和|(y1-y2)/y2|都大于收敛精度ε重新开始循环。 因为[a,b]为单谷或单峰区间,这样每次可将搜索区间缩小0.618倍, 处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间 上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到 满足预先给定的精度时,即获得一维优化问题的近似最优解 。
%画出函数图形
• title('黄金分割法求函数最小值-1304卢贵兵')
• xlabel('x')
• ylabel('f')
• axis tight
• a=x2-0.618*(x2-x1); %用黄金分割法求出两个黄金分割点的值
• b=x1+0.618*(x2-x1);
• k=0;
• while (x2-x1)>=d
• 其基本原理是:依照“去劣存优”原则、对称原则、 以及等比收缩原则来逐步缩小搜索区间。
• 以下是对单谷函数求最小值做简单分析: • 具体步骤是:在区间[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);
• 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的值,并且画出函数图像用来和 计算得出的最小值做对照。
• 黄金比例的求法如下: 设一条线段AB的长度为a,C点在靠近B点的黄金分割点上,且AC为b,则a
比b就是黄金数
• 黄金分割法是用于一元函数f(x)在给定初始区间,[a,b] 内搜索极小点xmin的一种方法。它是优化计算中的经 典算法,以算法简单、收敛速度均匀、效果较好而著 称,是许多优化算法的基础,但它只适用于一维区间 上的单谷或单峰函数,即只在单谷或单峰区间内才能 进行一维寻优,其收敛效率较低。
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)
%用黄金分割法计算新的b

else f1<f2

x2=b;

b=a;

a=x2-0.618*(x2-x1);

end
• 运行程序可以得到相同的结果
• 本题中需要注意的地方:1.度需要转化为弧度
• (3)讨论
• 黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于 另一部分与这部分之比。其比值是一个无理数,用分数表示为(√5-1)/2,取 其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此 称为黄金分割,也称为中外比。这个分割点就叫做黄金分割点。
• (1)M文件程序:
• function 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')
%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

x1=a;

x2=b;

a=x2-0.618*(x2-x1);

b=x1+0.618*(x2-x1);
• else f1<f2

Βιβλιοθήκη Baidu
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的最小值。
(2)报告(结果):
运行程序得:
• f1 =

-0.4996
• f2 =

-0.4996
• ans =

1
• k=

1
• f1 =

-0.4979
• f2 =

-0.4996
相关文档
最新文档