二维搜索,也就是优化两个未知变量,通常将二维搜索转化为一维搜索进行求解。
例题
二维搜索转一维——黄金分割
求函数二维函数A在某区间的最大值
A=( 6 - 2×l + l×cos(θ) ) × l×sin(θ)
l∈(0,3)
θ∈(0,π/2)
此处的搜索优化方法采用黄金分割法,且先后对两个未知量进行黄金搜索。
那么我们在同一个循环中,先固定l,对θ进行黄金分割搜索,然后固定θ,对l进行黄金分割搜索。
代码如下:
from sympy import *
a = 0 #角度区间下限
b = 90 #角度区间上限
c = 0 #长度区间下限
d = 3 #长度区间上限
dx = 0.05 #迭代精度
def func(x,l):
A = (6 - 2*l + l*cos(x*pi.evalf()/180)) * l*sin(x*pi.evalf()/180)
return A
i = 0
while True:
i += 1
x1 = b - 0.618*(b-a)
x2 = a + 0.618*(b-a)
l1 = d - 0.618*(d-c)
l2 = c + 0.618*(d-c)
if func(x1,l1) > func(x2,l1):
b = x2
elif func(x1,l1) <= func(x2,l1):
a = x1
if func(x1,l1) > func(x1,l2):
d = l2
elif func(x1,l1) <= func(x1,l2):
c = l1
DX = abs(b-a)
LX = abs(d-c)
if DX <= dx and LX <= dx :
print(f'迭代第{i}次,迭代精度小于等于{dx},最终的搜索区间为:θ∈{min(a, b), max(a, b)},l∈{min(c, d), max(c, d)}')
print(f'A的最大值:{func((a+b)/2, (c+d)/2)}')
break
else:
pass
结果:
迭代第16次,迭代精度小于等于0.05,最终的搜索区间为:θ∈(59.975536613662115, 60.01628009276722),l∈(1.999184553788737, 2.000542669758907)
A的最大值:5.19615234282692
如果不会一维黄金分割搜索,请先看我前面写的文章:
用黄金分割法(Golden Section Search Method)求函数最大值的python程序
二维搜索转一维——坐标循环法
coordinate cycling method(坐标循环法),是一种穷举法。
二维搜索求函数极值还有最笨的方法,那就是穷举法。
方法步骤:
此方法耗时耗力,不推荐,仅做了解
还是上面的例题。
代码如下:
from sympy import *
a = 0 #角度区间下限
b = 90 #角度区间上限
c = 0 #长度区间下限
d = 3 #长度区间上限
def func(x,l):
A = (6 - 2*l + l*cos(x*pi.evalf()/180)) * l*sin(x*pi.evalf()/180)
return A
A_list=[0,0,0]
x=0
for angle in (0,90):
while x < angle+1:
x = x + 1/100 #精度为0.01
l = 0
for length in (0,3):
while l < length+1:
l = l + 1/ 100 #精度为0.01
if func(x,l) > A_list[-1]:
A_list[-1] = func(x,l)
A_list[0] = x
A_list[1] = l
#print(A_list)
else:
pass
print(f'A的最大值为:{A_list[-1]}')
print(f'θ={A_list[0]},l={A_list[1]}')
结果:
A的最大值为:5.19615242270663
θ=59.99999999999663,l=2.0000000000000013