首先在matlab新建文件保存为goldmin.m
function[x,y] = goldmin(f,xa,xb,s)
% 黄金分割法求解函数最小值
% 输入
% f 待优化函数
g = (sqrt(5)-1)/2; % 黄金分割比,0.618
a = xa;
b = xb;
x2 = a + g*(b-a);
x1 = a + b - x2;
y1 = f(x1);
y2 = f(x2);
while abs(b-a) > s
if y1<y2
b = x2;
x2 = x1;
x1 = a + b - x2;
end
>> f = @(x) 2*x^2-x-1;
>> [x,y]=goldmin(f,-1,1,0.001)
x =
0.2497
y =
-1.1250
>>
即当x=0.2497时取最小值-1.125
菲波那契数列
经研究发现,相邻两个菲波那契数的比值是随序号的增加而逐渐趋于黄金分割比的。即f(n-1)/f(n)→0.618…。由于菲波那契数都是整数,两个整数相除之商是有理数,所以只是逐渐逼近黄金分割比这个无理数。但是当我们继续计算出后面更大的菲波那契数时,就会发现相邻两数之比确实是非常接近黄金分割比的。
窗口命令
gold_mean(-1,1,0.001)
ans =
.2499143985
代码见附件
文件1,gold_fun.m 目标函数
文件2,gold_mean.m 黄金分割法函数
function[x,y] = goldmin(f,xa,xb,s)
% 黄金分割法求解函数最小值
% 输入
% f 待优化函数
% a,b 区间
% s 精度
% 输出
% x 最优解
% y 最优解对应的最小值
%%
g = (sqrt(5)-1)/2; % 黄金分割比,0.618
a = xa;
b = xb;
x2 = a + g*(b-a);
x1 = a + b - x2;
y1 = f(x1);
y2 = f(x2);
while abs(b-a) > s
if y1<y2
b = x2;
x2 = x1;
x1 = a + b - x2;
end
if y1>=y2
a = x1;
x1 = x2;
x2 = a + b - x1;
end
y1=f(x1);
y2 = f(x2);
end
x = x1;
y = f(x);
然后在命令区输入
>> f = @(x) 2*x^2-x-1;
>> [x,y]=goldmin(f,-1,1,0.001)
x =
0.2497
y =
-1.1250
>>
即当x=0.2497时取最小值-1.125