python用fmin, fmin_powell, fmin_cg, fmin_bfgs求解无约束极小值点

背景:

作求解无约束极小值点范例。

代码:

import scipy.optimize as opt
import numpy as np

def test_fmin(fminfunc,x0,a):
    """
    x0为优化算法的初始值,各种优化算法必须
    a为目标函数的参数
    """
    def targetfunc(x):
        """
        fminfunc将求使得函数targetfunc值最小的x,这里的目标函数选的是各种优化算法中常用的一个函数
        """
        return 100*(x[0]**2-x[1])**2+(x[0]-a)**2

    print("=========================")
    print('求解函数名称:',fminfunc.__name__)

    print()
    # 优化算法求解
    h0 = fminfunc(targetfunc,x0)
    
    print()
    #输出求解出的极小值点
    print("极小值点:",h0)
    print()

#初始值点
x0 = np.array([12.,32.])
a = 9

test_fmin(opt.fmin,x0,a)
test_fmin(opt.fmin_powell,x0,a)
test_fmin(opt.fmin_cg,x0,a)
test_fmin(opt.fmin_bfgs,x0,a)

结果:

=========================
求解函数名称: fmin


Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 113
         Function evaluations: 216


极小值点: [  8.99999737  80.9999528 ]


=========================
求解函数名称: fmin_powell


Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 37
         Function evaluations: 1072


极小值点: [  9.  81.]


=========================
求解函数名称: fmin_cg


Warning: Desired error not necessarily achieved due to precision loss.
         Current function value: 114.368222
         Iterations: 16
         Function evaluations: 243
         Gradient evaluations: 59


极小值点: [-1.55212512  2.5828991 ]


=========================
求解函数名称: fmin_bfgs


Warning: Desired error not necessarily achieved due to precision loss.
         Current function value: 0.000000
         Iterations: 58
         Function evaluations: 608
         Gradient evaluations: 149


极小值点: [  8.99980808  80.99654173]

分析:

  1. 可以看出各优化算法得到的最小值点不尽相同,而fmin_cg函数并不能求出最小值点。这里并不是说明这种优化算法不好,各种求最小值的算法都有一定的适用范围,可能对这个问题fmin_cg函数不是很好。
  2. 参与过公司开发优化的项目,目标函数带参数的问题一直不是很好处理,用全局变量又耗时间,后来直接写了一个类解决了,如果在python中该不会有这个问题。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值