二维搜索求函数极值的python程序

二维搜索,也就是优化两个未知变量,通常将二维搜索转化为一维搜索进行求解。

例题

二维搜索转一维——黄金分割

求函数二维函数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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值