求解多变量非线性全局最优解_优化 | 利用SciPy求解非线性规划问题

本文详细介绍了如何利用SciPy的optimize模块解决非线性规划问题,包括一维搜索、无约束多元优化、非线性最小二乘问题和约束优化问题。通过实例展示了brent()、fmin_ncg()、fmin_bfgs()、leastsq()和slsqp()等函数的用法,强调了目标函数和约束条件的连续光滑性对求解的重要性。
摘要由CSDN通过智能技术生成

f672672e6af7e061c73db09bed9e2fdf.png

作者:莫斑炜

编者按:本文使用SciPy的optimize模块来求解非线性规划问题,结合实际例子,引入非线性规划问题的求解算法及相应函数的调用。

本文提纲

  • 一维搜索/单变量优化问题
  • 无约束多元优化问题
  • 非线性最小二乘问题
  • 约束优化问题

非线性规划问题的目标函数或约束条件是非线性的。本文使用SciPy的optimize模块来求解非线性规划问题。

目标函数和约束条件是否连续光滑是非常重要的性质,这是因为如果光滑,则所有决策变量可微,多变量函数的偏导数组成的向量为梯度,梯度是指向目标函数增长最快的方向。将目标函数梯度作为搜索方向,对非线性规划问题的求解具有重要的意义。这些函数或其导数梯度的不连续性给许多现有的非线性优化问题的求解带来了困难。在下文中,我们假设这些函数是连续且光滑的。

# Importing Modules
from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np
import sympy

1、一维搜索/单变量优化问题(Univariate Optimization)

无约束非线性规划最简单的形式是一维搜索。一维搜索通常作为多维优化问题中的一部分出现,比如梯度下降法中每次最优迭代步长的估计。求解一维搜索常用的两类方法是函数逼近法和区间收缩法。其中函数逼近法是指用较简单的函数近似代替原来的函数,用近似函数的极小点来估计原函数的极小点,比如牛顿法;区间收缩法对于一个单谷函数通过迭代以不断缩小该区间的长度,当区间长度足够小时,可将该区间中的一点作为函数的极小点,比如黄金分割法。

e.g. 最小化一个单位体积的圆柱体的表面积。

ede12f299fe0f749fc4e116f751414d4.png
 r, h = sympy.symbols("r, h")
Area = 2 * sympy.pi * r**2 + 2 * sympy.pi * r * h
Volume = sympy.pi * r**2 * h
h_r = sympy.solve(Volume - 1)[0]
Area_r = Area.subs(h_r)
rsol = sympy.solve(Area_r.diff(r))[0]
rsol.evalf()
# 0.541926070139289

# 再验证二阶导数为正且rsol对应最小值
Area_r.diff(r, 2).subs(r, rsol)
Area_r.subs(r, rsol)
_.evalf()
# 5.53581044593209

使用SciPy中optimize模块中的brent()函数来最小化一维函数。brent方法是一种混合方法,结合了牛顿法和二分法,既能保证稳定性又能快速收敛,通常是SciPy一维搜索的首选方法。

首先定义一个Python函数f作为目标函数。将f传给optimize.brent,参数brack表示指定算法的开始区间。

def f(r):
    return 2 * np.pi * r**2 + 2 / r
r_min = optimize.brent(f, brack=(0.1, 4))
r_min
# 0.5419260772557135
f(r_min)
# 5.535810445932
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值