仅适用于以下情况:区间内单调或者最多一个极小值
代码
以[0,pi]内的三角函数为例
clc
clear
close all
x=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_max
break
end
if res1<res2%左边的点的值较小,下一轮迭代取左边的“半边”
x1=x0-num;
x2=x0;
elseif res1>res2%右边的点的值较小,下一轮迭代取右边的“半边”
x1=x0;
x2=x0+num;
end
xxx0(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