欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python使用minimize()?函數(shù)替代matlab的fmincon函數(shù)

 更新時間:2022年09月14日 15:33:52   作者:趙孝正  
這篇文章主要介紹了python使用minimize()函數(shù)替代matlab的fmincon函數(shù),在matlab中,fmincon函數(shù)可以用于求解帶約束的非線性多變量函數(shù)的最小值,即可以用來求解非線性規(guī)劃問題

1. matlab 中的 fmincon() 函數(shù)

matlab 求解非線性規(guī)劃

在matlab中,fmincon函數(shù)可以用于求解帶約束的非線性多變量函數(shù)的最小值,即可以用來求解非線性規(guī)劃問題。

基本語法

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

  • x 的返回值是決策向量 x 的取值,fval 的返回值是目標函數(shù) f(x) 的取值
  • fun 是用 M 文件定義的函數(shù) f(x) ,代表了(非)線性目標函數(shù)
  • x0 是 x 的初始值
  • A, b, Aeq, beq 定義了線性約束 ,如果沒有線性約束,則 A=[], b=[], Aeq=[], beq=[]
  • lb 和 ub 是變量 x 的下界和上界,如果下界和上界沒有約束,則 lb=[], ub=[],也可以寫成 lb 的各分量都為 -inf, ub 的各分量都為 inf
  • nonlcon 是用 M 文件定義的非線性向量函數(shù)約束。
  • options 定義了優(yōu)化參數(shù),不填寫表示使用 Matlab 默認的參數(shù)設置。

實例

示例,求下列非線性規(guī)劃:

(1)編寫 M 函數(shù) fun1.m 定義目標函數(shù):

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

(2)編寫 M 函數(shù) 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)編寫主程序函數(shù)

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

所得結(jié)果為:

2. python中的minimize()函數(shù)

minimize函數(shù)的尋找參數(shù)

在 python 的 scipy.optimize 庫中包含該函數(shù)的替代函數(shù) minimize() ,該函數(shù)的使用與 matlab 的 fminunc 函數(shù)有些不同,下面總結(jié)下,自己在使用的過程中遇到的問題。

首先查看下該函數(shù):

官方聲明過長,我把它放在該篇博客的最后面:

# 這是其聲明,我認為去查看函數(shù)的說明可以達到事半功倍的效果,千萬別忽略
def minimize(fun, x0, args=(), method=None, jac=None, hess=None,
             hessp=None, bounds=None, constraints=(), tol=None,
             callback=None, options=None):

著重介一些重要參數(shù)代表什么:

fun:該參數(shù)就是 costFunction 你要去最小化的損失函數(shù),將 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.

意思就是損失函數(shù)在定義時,**theta 必須為第一個參數(shù)且其shape必須為(n, )**即一維數(shù)組。在計算損失函數(shù)的時候用到的其他參數(shù)以元組的形式傳入到 args 參數(shù)中(其他參數(shù)具體指 X,Y,lambda 等),最后返回損失的值,可以為數(shù)組形式,也可以為一個實數(shù).

  • x0: 參數(shù) x0 就是初始化的 theta, 其 shape 必須為 shape(n,) 即一維數(shù)組.
  • method:該參數(shù)代表采用的方式,默認是 BFGS, L-BFGS-B, SLSQP 中的一種,可選 TNC
  • jac:該參數(shù)就是計算梯度的函數(shù),和 fun 參數(shù)類似,第一個必須為 theta 且其 shape 必須為 (n, ) 即一維數(shù)組,最后返回的梯度也必須為一個一維數(shù)組。
  • options:用來控制最大的迭代次數(shù),以字典的形式來進行設置,例如:options={‘maxiter’:400}

minimize求解約束函數(shù)最小值

  • fun: 求最小值的目標函數(shù)
  • x0:變量的初始猜測值,如果有多個變量,需要給每個變量一個初始猜測值。minimize會出現(xiàn)局部最優(yōu)的情況,所以這塊的處理方法需要尋找。
  • args:常數(shù)值,后面例子會講解,fun中沒有數(shù)字,都以變量的形式表示,對于常數(shù)項,需要在這里給值
  • method:求極值的方法,官方文檔給了很多種。一般使用默認。每種方法我理解是計算誤差,反向傳播的方式不同而已,這塊有很大理論研究空間
  • constraints:約束條件,針對fun中為參數(shù)的部分進行約束限制
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)

執(zhí)行結(jié)果:函數(shù)的最小值為2點多

到此這篇關于python使用minimize() 函數(shù)替代matlab的fmincon函數(shù)的文章就介紹到這了,更多相關python fmincon內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論