python使用minimize() 函数替代matlab的fmincon函数

目录
  • 1. matlab 中的 fmincon() 函数
    • 基本语法
    • 实例
  • 2. python中的minimize()函数
    • minimize函数的寻找参数
    • minimize求解约束函数最小值

1. matlab 中的 fmincon() 函数

matlab 求解非线性规划

在matlab中,fmincon函数可以用于求解带约束的非线性多变量函数的最小值,即可以用来求解非线性规划问题。

基本语法

[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)

  • x 的返回值是决策向量 x 的取值,fval 的返回值是目标函数 f(x) 的取值
  • fun 是用 M 文件定义的函数 f(x) ,代表了(非)线性目标函数
  • x0 是 x 的初始值
  • A, b, Aeq, beq 定义了线性约束 ,如果没有线性约束,则 A=[], b=[], Aeq=[], beq=[]
  • lb 和 ub 是变量 x 的下界和上界,如果下界和上界没有约束,则 lb=[], ub=[],也可以写成 lb 的各分量都为 -inf, ub 的各分量都为 inf
  • nonlcon 是用 M 文件定义的非线性向量函数约束。
  • options 定义了优化参数,不填写表示使用 Matlab 默认的参数设置。

实例

示例,求下列非线性规划:

(1)编写 M 函数 fun1.m 定义目标函数:

function f = fun1(x);
f = x(1).^2 + x(2).^2 + x(3).^2 + 8;

(2)编写 M 函数 fun2.m 定义非线性约束条件:

function [g, h] = fun2(x);
g = [-x(1).^2+x(2)-x(3).^2
    x(1)+x(2).^2+x(3).^3-20];
h = [-x(1)-x(2).^2+2
    x(2)+2*x(3).^2-3];

(3)编写主程序函数

[x, y] = fmincon('fun1', rand(3, 1), [], [], [], [], zeros(3,1), [], 'fun2')

所得结果为:

2. python中的minimize()函数

minimize函数的寻找参数

在 python 的 scipy.optimize 库中包含该函数的替代函数 minimize() ,该函数的使用与 matlab 的 fminunc 函数有些不同,下面总结下,自己在使用的过程中遇到的问题。

首先查看下该函数:

官方声明过长,我把它放在该篇博客的最后面:

# 这是其声明,我认为去查看函数的说明可以达到事半功倍的效果,千万别忽略
def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
             hessp=None, bounds=None, constraints=(), tol=None,
             callback=None, options=None):

着重介一些重要参数代表什么:

fun:该参数就是 costFunction 你要去最小化的损失函数,将 costFunction 的名字传给 fun

官方给的提示:

The objective function to be minimized.
fun(x, *args) -> float
where x is an 1-D array with shape (n,) and args
is a tuple of the fixed parameters needed to completely
specify the function.

意思就是损失函数在定义时,**theta 必须为第一个参数且其shape必须为(n, )**即一维数组。在计算损失函数的时候用到的其他参数以元组的形式传入到 args 参数中(其他参数具体指 X,Y,lambda 等),最后返回损失的值,可以为数组形式,也可以为一个实数.

  • x0: 参数 x0 就是初始化的 theta, 其 shape 必须为 shape(n,) 即一维数组.
  • method:该参数代表采用的方式,默认是 BFGS, L-BFGS-B, SLSQP 中的一种,可选 TNC
  • jac:该参数就是计算梯度的函数,和 fun 参数类似,第一个必须为 theta 且其 shape 必须为 (n, ) 即一维数组,最后返回的梯度也必须为一个一维数组。
  • options:用来控制最大的迭代次数,以字典的形式来进行设置,例如:options={‘maxiter’:400}

minimize求解约束函数最小值

  • fun: 求最小值的目标函数
  • x0:变量的初始猜测值,如果有多个变量,需要给每个变量一个初始猜测值。minimize会出现局部最优的情况,所以这块的处理方法需要寻找。
  • args:常数值,后面例子会讲解,fun中没有数字,都以变量的形式表示,对于常数项,需要在这里给值
  • method:求极值的方法,官方文档给了很多种。一般使用默认。每种方法我理解是计算误差,反向传播的方式不同而已,这块有很大理论研究空间
  • constraints:约束条件,针对fun中为参数的部分进行约束限制
1.计算 1/x+x 的最小值

# coding=utf-8
from scipy.optimize import minimize
import numpy as np

#demo 1
#计算 1/x+x 的最小值
 def fun(args):
     a=args
     v=lambda x:a/x[0] +x[0]
     return v

 if __name__ == "__main__":
     args = (1)  #a
     x0 = np.asarray((2))  # 初始猜测值
     res = minimize(fun(args), x0, method='SLSQP')
     print(res.fun)
     print(res.success)
     print(res.x)

执行结果:函数的最小值为2点多

到此这篇关于python使用minimize() 函数替代matlab的fmincon函数的文章就介绍到这了,更多相关python fmincon内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 非线性规划方式(scipy.optimize.minimize)

    一.背景: 现在项目上有一个用python 实现非线性规划的需求.非线性规划可以简单分两种,目标函数为凸函数 or 非凸函数. 凸函数的 非线性规划,比如fun=x^2+y^2+x*y,有很多常用的python库来完成,网上也有很多资料,比如CVXPY 非凸函数的 非线性规划(求极值),从处理方法来说,可以尝试以下几种: 1.纯数学方法,求导求极值: 2.使用神经网络,深度学习来处理,可参考反向传播算法中链式求导的过程: 3.寻找一些python库来做,本文介绍scipy.optimize.mi

  • python如何处理matlab的mat数据

    目录 处理matlab的mat数据 处理matlab的*.mat格式数据及常见错误汇总 一.数据读取错误 二.数据类型错误 处理matlab的mat数据 python 和matlab是2个常用的实验室平台工具,在一些应用下,这2个不同平台下的数据会打交道,因此如何读取和保存显得尤为重要,这里需要用到python的第三方平台下的scipy模块. 先用下面这个命令检查是否下载好scipy import scipy 如果报错,用python install scipy 或者 conda install

  • mat矩阵和npy矩阵实现互相转换(python和matlab)

    目录 mat矩阵和npy矩阵互相转换 numpy.narray矩阵保存为mat文件 读取mat文件 npy文件与mat文件的保存与读取 1. npy文件 2. mat文件 mat矩阵和npy矩阵互相转换 numpy.narray矩阵保存为mat文件 import numpy as np import scipy.io as io mat_path = 'your_mat_save_path' mat = np.zeros([4, 20]) io.savemat(mat_path, {'name'

  • 关于Python下的Matlab函数对应关系(Numpy)

    目录 Matlab函数对应关系(Numpy) Numpy与Matlab互转操作 1.常用操作(参考numpy官方说明) 2.线性变换(参考numpy官方说明) Matlab函数对应关系(Numpy) 首先给出官网链接,其中详细说明了在Python下如何用Numpy实现Matlab下相同的函数功能. 博主在用Python撰写代码的时候,想用Python实现在Matlab下某个函数的功能(比如Repmat函数),但是当使用语句 from numpy.matlib import repmat A =

  • python使用minimize() 函数替代matlab的fmincon函数

    目录 1. matlab 中的 fmincon() 函数 基本语法 实例 2. python中的minimize()函数 minimize函数的寻找参数 minimize求解约束函数最小值 1. matlab 中的 fmincon() 函数 matlab 求解非线性规划 在matlab中,fmincon函数可以用于求解带约束的非线性多变量函数的最小值,即可以用来求解非线性规划问题. 基本语法 [x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub,

  • 在Python中使用itertools模块中的组合函数的教程

    理解新概念 Python V2.2 中引入了迭代器的思想.唔,这并不十分正确:这种思想的"苗头"早已出现在较老的函数 xrange() 以及文件方法 .xreadlines() 中了.通过引入 yield 关键字,Python 2.2 在内部实现的许多方面推广了这一概念,并使编程定制迭代器变得更为简单( yield 的出现使函数转换成生成器,而生成器反过来又返回迭代器). 迭代器背后的动机有两方面.将数据作为序列处理通常是最简单的方法,而以线性顺序处理的序列通常并不需要都同时实际 存在

  • 详解如何在python中读写和存储matlab的数据文件(*.mat)

    背景 在做deeplearning过程中,使用caffe的框架,一般使用matlab来处理图片(matlab处理图片相对简单,高效),用python来生成需要的lmdb文件以及做test产生结果.所以某些matlab从图片处理得到的label信息都会以.mat文件供python读取,同时也python产生的结果信息也需要matlab来做进一步的处理(当然也可以使用txt,不嫌麻烦自己处理结构信息). 介绍 matlab和python间的数据传输一般是基于matlab的文件格式.mat,pytho

  • 在python中利用最小二乘拟合二次抛物线函数的方法

    1.最小二乘也可以拟合二次函数 我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的.下面我们就来试试用最小二乘来拟合抛物线形状的的图像. 对于二次函数来说,一般形状为 f(x) = a*x*x+b*x+c,其中a,b,c为三个我们需要求解的参数.为了确定a.b.c,我们需要根据给定的样本,然后通过调整这些参数,知道最后找出一组参数a.b.c,使这些所有的样本点距离f(x)的距离平方和最小.用什么方法来调整这些参数呢?最常见的自然就是我们的梯度下降

  • 利用Python NumPy库及Matplotlib库绘制数学函数图像

    目录 前言 NumPy与Matplotlib 函数绘图 所需库函数语法 导入所需模块 一元一次函数 一元二次函数 指数函数 正弦函数 余弦函数 高级玩法 总结 前言 最近开始学习数学了,有一些题目的函数图像非常有特点,有一些函数图像手绘比较麻烦,那么有没有什么办法做出又标准又好看的数学函数图像呢? 答案是有很多的,有很多不错的软件都能画出函数图像,但是,我想到了Python的数据可视化.Python在近些年非常火热,在数据分析以及深度学习等方面得到广泛地运用,其丰富的库使其功能愈加强大. 这里我

  • MATLAB中subplot函数的语法与使用实例

    目录 语法 说明 示例 上部和下部子图 子图的象限 大小不同的子图 将子图替换为空坐标区 自定义位置上的子图 创建包含极坐标区的子图 创建后修改坐标区属性 使子图成为当前坐标区 将现有坐标区转换为子图 将不同图窗中的坐标区转换为子图 总结 subplot函数的功能是在各个分块位置创建坐标区. 语法 subplot(m,n,p) subplot(m,n,p,'replace') subplot(m,n,p,'align') subplot(m,n,p,ax) subplot('Position',

  • Python中在脚本中引用其他文件函数的实现方法

    在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址.所以如果要在当前脚本引用其他文件,除了将文件放在和脚本同一目录下,还有以下几种方法, 1. 将文件所在位置添加到sys.path中 import sys sys.path.insert(0, '/path/to/application/app/folder') # or sys.path.append('/path/to/application/a

  • python实现颜色rgb和hex相互转换的函数

    本文实例讲述了python实现颜色rgb和hex相互转换的函数.分享给大家供大家参考.具体分析如下: 下面的python代码提供了两个函数分别用来将rgb表示的颜色转换成hex值,hex转换成rgb,rgb为一个三个数的元祖,如(128,255,28),hex为数字876645 def hex2rgb(hexcolor): rgb = [(hexcolor >> 16) & 0xff, (hexcolor >> 8) & 0xff, hexcolor & 0

  • python中lambda函数 list comprehension 和 zip函数使用指南

    lambda 函数 Python 支持一种有趣的语法,它允许你快速定义单行的最小函数.这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方. def f(x): return x*2,用lambda函数来替换可以写成:g = lambda x: x*2`g(3)结果是6.(lambda x: x*2)(3)`也是同样的效果. 这是一个 lambda 函数,完成同上面普通函数相同的事情.注意这里的简短的语法:在参数列表周围没有括号,而且忽略了 return 关键字

  • python实现得到一个给定类的虚函数

    本文实例讲述了python实现得到一个给定类的虚函数的方法,分享给大家供大家参考.具体如下: 现来看看如下代码: import wx for method in dir(wx.PyPanel): #这里改成给定的类 if method.startswith("base_"): print method 输出的结果为: base_AcceptsFocus base_AcceptsFocusFromKeyboard base_AddChild base_DoGetBestSize base

随机推荐