python使用minimize()?函數(shù)替代matlab的fmincon函數(shù)
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 中的一種,可選 TNCjac:
該參數(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python中使用封裝類還是函數(shù)以及它們的區(qū)別
在Python編程中,類和函數(shù)都是重要的代碼組織工具,但它們在封裝性、狀態(tài)保持、可重用性、繼承與多態(tài)、設計模式、代碼組織、執(zhí)行流程、參數(shù)傳遞、返回值和上下文管理等方面存在明顯區(qū)別2024-10-10Python實現(xiàn)樹莓派攝像頭持續(xù)錄像并傳送到主機的步驟
這篇文章主要介紹了Python實現(xiàn)樹莓派攝像頭持續(xù)錄像并傳送到主機的步驟,幫助大家更好的理解和學習python,感興趣的朋友可以了解下2020-11-11python求最大值,不使用內(nèi)置函數(shù)的實現(xiàn)方法
今天小編就為大家分享一篇python求最大值,不使用內(nèi)置函數(shù)的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07詳解python3中用HTMLTestRunner.py報ImportError: No module named ''
這篇文章主要介紹了詳解python3中用HTMLTestRunner.py報ImportError: No module named 'StringIO'如何解決,感興趣的可以了解一下2019-08-08