算法原理
- Step 1:对目标函数f(x),确定初始区间[a,b],确定计算终止条件(点距准则)ε;
- Step 2:计算f’((a+b)/2);
- Step 3:如果f’((a+b)/2)<0,说明极值点在[(a+b)/2,b]区间内,令a=(a+b)/2;
- Step 4:如果f’((a+b)/2)>0,说明极值点在[a,(a+b)/2]区间内,令b=(a+b)/2;
- Step 5:如果b-a<ε,终止迭代,否则返回Step 2;
备注:对于函数不便于求导函数的情况,可以取小量σ,f((a+b)/2-σ)<f((a+b)/2+σ)说明f’((a+b)/2)>0,反之f’((a+b)/2)<0;
算法实现
def func(x):
return x**2 + x + 5
left = -100
right = 100
sigma = 0.0001
mid = (left + right) / 2
while (1):
x1 = mid - sigma
x2 = mid + sigma
if (func(x1) < func(x2)):
right = x2
else:
left = x1
if (right - left < 0.001):
break
mid = (left + right) / 2
print("left=%s,right=%s" % (left, right))