function y=ff(x1,x2)
%y=10*(x1+x2-5)^2+(x1-x2)^2;
y=x1^2+x2^2-x1*x2-10*x1-4*x2+60;
function alpha=goldmethod2(x01,x02,d,h0)
% 输入分割比gama
gama=0.618;
% 确定搜索区间[a,b]
[a,b]=search2(x01,x02,d,h0);
%计算a1,a2和函数值y1,y2, 确定最优步长 alpha
a1=b-gama*(b-a);y1=ff(x01+d(1)*a1,x02+d(2)*a1);
a2=a+gama*(b-a);y2=ff(x01+d(1)*a2,x02+d(2)*a2);
for n=1:100
if y1>=y2
x1(n)=a1;x2(n)=a2;yp1(n)=y1;yp2(n)=y2;
a=a1;a1=a2;y1=y2;
a2=a+gama*(b-a);y2=ff(x01+d(1)*a2,x02+d(2)*a2);
else
x1(n)=a1;x2(n)=a2;yp1(n)=y1;yp2(n)=y2;
b=a2;a2=a1;y2=y1;
a1=b-gama*(b-a);y1=ff(x01+d(1)*a1,x02+d(2)*a1);
end
aa(n)=(a+b)/2; %输出极值点
y(n)=ff(x01+d(1)*aa(n),x02+d(2)*aa(n)); %输出极值点函数值
e(n)=abs(b-a);
alpha=(a+b)/2;
if abs(b-a)<1e-5
break;
end
end
clear;
h0=0.1;
x0=[0,0];
e=[1,0;0,1];
xp=[0,0];
for k=1:20
k
for i=1:2
i
x01=x0(1);x02=x0(2);d=e(i,:);
alpha=goldmethod2(x01,x02,d,h0); % 确定最优步长 alpha
alpha
x1=x0+alpha*d;
x0=x1;
xp
end
xn=x1;
if abs(xn-xp)<1e-1
break;
end
xp=xn;
end
clear;
% 给定初始值
h0=0.1;
x0=[0,0];
e=[1,0;0,1];
n=2;
for k=1:20
k % k 代表第轮计算
% 111111111111111111 第 1 到 n 次搜索计算111111111111111111
for i=1:1 % 第1次搜索
i
x01=x0(1);x02=x0(2);d=e(i,:);
F0=ff(x0(1),x0(2));
alpha=goldmethod2(x01,x02,d,h0); % 确定最优步长 alpha
alpha
x(i,:)=x0+alpha*d;
F(i)=ff(x(i,1),x(i,2));
Delta(i)=F(i)-F0;
end
for i=2:n % 第2到n次搜索
i
x01=x(i-1,1);x02=x(i-1,2);d=e(i,:);
alpha=goldmethod2(x01,x02,d,h0); alpha
x(i,:)=x(i-1,:)+alpha*d;
F(i)=ff(x(i,1),x(i,2));
Delta(i)=F(i-1)-F(i);
% 确定最优步长 alpha
end
% 1111111111111111111111111111111111111111111111111111111111
% 22222222222222222 精度是否满足要求 22222222222222222222222
if abs(x(n,:)-x0)<1e-3
break;
end
% 2222222222222222222222222222222222222222222222222222222222
% 3333333333333333333 第n次结束参数计算 33333333333333333333
d=x(n,:)-x0;
x(n+1,:)=2*x(n,:)-x0;
[Delta_m,j]=max(Delta);
F2=F(n);F3=ff(x(n+1,1),x(n+1,2));
% 3333333333333333333333333333333333333333333333333333333333
% 44444444444444444 搜索方向是否进行替换 44444444444444444444
if F3 x01=x(n,1);x02=x(n,2); alpha=goldmethod2(x01,x02,d,h0); alpha x(n+1,:)=x(n,:)+alpha*d; e(j,:)=[]; e(n,:)=d; x0=x(n+1,:); else if F2 else % 确定最优步长 alpha x0=x(n+1,:); end end % 44444444444444444444444444444444444444444444444444444444444 x0 x end function [a,b]=search(x01,x02,d,h0) % search 为外推法确定搜索区间函数 % h0 为初始试探步长 % [a,b] 为搜索区间 %%%%%%%%%% 第一次搜索 %%%%%%%%% a1=0; y1=ff(x01+d(1)*a1,x02+d(2)*a1); h=h0; a2=h; y2=ff(x01+d(1)*a2,x02+d(2)*a2); if y2>y1 %反向搜索 h=-h; a3=a1;y3=y1; a1=a2;y1=y2; a2=a3;y2=y3; end a3=a2+h;y3=ff(x01+d(1)*a3,x02+d(2)*a3); %%%%%%%%%% 继续搜索 %%%%%%%%%% while y3 a1=a2;y1=y2; a2=a3;y2=y3; a3=a2+h; y3=ff(x01+d(1)*a3,x02+d(2)*a3); end %%%%%%%%%% 确定搜索区间 %%%%%%%%%% if h>0 a=a1;b=a3; else a=a3;b=a1; end % a,b 因篇幅问题不能全部显示,请点此查看更多更全内容