仅适用于以下情况:区间内单调或者最多一个极小值
代码
以[0,pi]内的三角函数为例
clc
clear
close allx=0:pi/1000:pi;
y=test(x);
figure()
plot(x,y,'.')cutnum=100;x1=x(1);
x2=x(end);
error_max=10^-1000;%能接受的误差上限
for i=1:cutnum%这里cutnum是取值上限num=(x(end)-x(1))/(2^i);%每次迭代的步长x0=(x1+x2)/2;%中心点x01=x1+(x2-x1)/8;%取中心点左边的某一个点的横坐标x02=x2-(x2-x1)/8;%取中心点右边的某一个点的横坐标res0=test(x0);res1=test(x01);%取中心点左边的某一个点的纵坐标res2=test(x02);%取中心点右边的某一个点的纵坐标error=abs(res1-res2);%计算误差if error<=error_maxbreakend if res1<res2%左边的点的值较小,下一轮迭代取左边的“半边”x1=x0-num;x2=x0;elseif res1>res2%右边的点的值较小,下一轮迭代取右边的“半边”x1=x0;x2=x0+num;endxxx0(i)=x0/pi;xxx1(i)=x1/pi;xxx2(i)=x2/pi;
end
%% 显示结果
i%循环次数
error%误差
bestans=x0%最优解
test.m
function y=test(x)
y=5*sin(x)+3*cos(0.5*x)+2*sin(4*x)-4*sin(8*x)-9*sin(7*x);
效果
正确
1.多个极小值点,运气好
y=5sin(x)+3cos(0.5x)+2sin(4*x);
输出最小值解为2.9824,实际最小值解应该为2.9824
2.一个极小值点,计算正确
y=-5sin(x)-3cos(0.5*x);
输出最小值解为1.3788,实际最小值解应该为1.3788
3.没有极小值点,计算正确
y=5sin(x)+3cos(0.5*x);
输出最小值解为3.1416,实际最小值解应该为3.1416
有误:多个极小值点,可能会干扰计算精度
y=5sin(x)+3cos(0.5x)+2sin(4x)-4sin(8x)-9sin(7*x);
输出最小值解为2.8913,实际最小值解应该为0.1885