python使用minimize()?函數替代matlab的fmincon函數
1. matlab 中的 fmincon() 函數
matlab 求解非線性規(guī)劃
在matlab中,fmincon函數可以用于求解帶約束的非線性多變量函數的最小值,即可以用來求解非線性規(guī)劃問題。
基本語法
[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 定義了優(yōu)化參數,不填寫表示使用 Matlab 默認的參數設置。
實例
示例,求下列非線性規(guī)劃:
(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 中的一種,可選 TNCjac:
該參數就是計算梯度的函數,和 fun 參數類似,第一個必須為 theta 且其 shape 必須為 (n, ) 即一維數組,最后返回的梯度也必須為一個一維數組。options:
用來控制最大的迭代次數,以字典的形式來進行設置,例如:options={‘maxiter’:400}
minimize求解約束函數最小值
- fun: 求最小值的目標函數
- x0:變量的初始猜測值,如果有多個變量,需要給每個變量一個初始猜測值。minimize會出現局部最優(yōu)的情況,所以這塊的處理方法需要尋找。
- 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)
執(zhí)行結果:函數的最小值為2點多
到此這篇關于python使用minimize() 函數替代matlab的fmincon函數的文章就介紹到這了,更多相關python fmincon內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現樹莓派攝像頭持續(xù)錄像并傳送到主機的步驟
這篇文章主要介紹了Python實現樹莓派攝像頭持續(xù)錄像并傳送到主機的步驟,幫助大家更好的理解和學習python,感興趣的朋友可以了解下2020-11-11詳解python3中用HTMLTestRunner.py報ImportError: No module named ''
這篇文章主要介紹了詳解python3中用HTMLTestRunner.py報ImportError: No module named 'StringIO'如何解決,感興趣的可以了解一下2019-08-08