Python实现Powell方法

题目:
在这里插入图片描述
代码:(思路以后再写)

import numpy as np
from sympy import symbols, diff,solve

count = 0  # 迭代次数
maxtimes = 40  # 最大迭代次数
e = 0.01

X0 = [0,0]  # 初始点
# 初始方向
d1 = [1,0]
d2 = [0,1]

alpha = symbols('alpha')

def fun(x1,x2):
    return 10*(x1+x2-5)**2 + (x1 - x2)**2

while count < maxtimes:
    count = count + 1
    print('-------第{}次迭代-----'.format(count))
    # (1)
    F0 = fun(X0[0],X0[1])
    print('F0 = ',F0)
    
    X1 = list(np.array(X0) + alpha*np.array(d1))
    res1 = fun(X1[0],X1[1])
    print(res1)
    a = sympy.solve(res1,alpha)   # 写入需要解的方程体
    a1 = complex(a[0]).real  # 取出复数的实部
    a1 = round(a1,4)
    print('a1 = ',a1)
    
    # X1 = [a1,X1[1]]
    X1 = list(np.array(X0) + a1*np.array(d1))
    print('X1 = ',X1)
    
    F1 = fun(X1[0],X1[1])
    print('f1=',F1)
    
    delta1 = abs(F0-F1)
    print('delta1 = ',delta1)
    
    # (2)
    X2 = list(np.array(X1) + alpha*np.array(d2))
#     print('X2=',X2)
    
    res2 = fun(X2[0],X2[1])
    print(res2)
    b = sympy.solve(res2,alpha)   # 写入需要解的方程体
    a2 = complex(b[0]).real  # 取出复数的实部
    a2 = round(a2,4)
    print('a2 = ',a2)
    
    # X2 = [X2[0],a2]
    X2 = list(np.array(X1) + a2*np.array(d2))
    print('X2 = ',X2)
    
    F2 = fun(X2[0],X2[1])
    print('f2=',F2)
    
    delta2 = abs(F2-F1)
    print('delta2 = ',delta2)
    # 取沿 d1 d2 搜索方向增量的最大者
    d_delta = max(delta1,delta2)
    print('d_delta = ',d_delta)
    
    # 终点 x2 的反射点和函数值为
    X3 = list(2*np.array(X2)-np.array(X0))
    print('X3 = ',X3)
    F3 = fun(X3[0],X3[1])
    print('f3 = ',F3)
    
    # (3) 鲍威尔条件判断
    if F3 > F0:
        print('---不满足判断条件,继续迭代...')
        if F2 < F3:
            X0 = X2
    else:
        d3 = list(np.array(X2)-np.array(X0))
        print('d3 = ',d3)
        X0 = list(np.array(X2) + alpha*np.array(d3))
        
        res3 = fun(X0[0],X0[1])
        print(res3)
        c = sympy.solve(res3,alpha)   # 写入需要解的方程体
        a3 = complex(c[0]).real  # 取出复数的实部
        a3 = round(a3,4)
        print('a3 = ',a3)
        
        X0 = list(np.array(X2) + a3*np.array(d3))
        
    if F3 < e:  # 达到了精度,结束迭代
        print('满足Powell条件,结束迭代')
        print('共迭代了{}次'.format(count))
        print('此时的坐标点:',X0)
        print('此时的极小值:',round(fun(X0[0],X0[1]),7))
        break

结果(太长,只截取了部分):
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值