0,i=1,...,mhj(x)=0,j=1,...,n\begin{aligned}min\f(x)\\s.t.\quadg_i(x)&\gt0,i=1,...,m\\\quadh_j(x)&=0,j=1,...,n\end{aligned}minf(x)s.t.gi?(x)hj?(x)?>0,i=1,...,m=0,j=1,...,n?其中xxx是一個向量,gi(x)g_i(x)gi?" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python——使用scipy求解帶約束的最優化問題

系統 2959 0

我們要求解的最優化問題的形式如下:
m i n ? f ( x ) s . t . g i ( x ) > 0 , i = 1 , . . . , m h j ( x ) = 0 , j = 1 , . . . , n \begin{aligned} min \ f(x) \\ s.t.\quad g_i(x)& \gt 0, i = 1,...,m\\ \quad h_j(x)& = 0, j = 1,...,n \end{aligned} m i n ? f ( x ) s . t . g i ? ( x ) h j ? ( x ) ? > 0 , i = 1 , . . . , m = 0 , j = 1 , . . . , n ?
其中 x x x 是一個向量, g i ( x ) g_i(x) g i ? ( x ) 是非等式約束, h j ( x ) h_j(x) h j ? ( x ) 是等式約束。

示例

x , y , z > 0 , x y z = 1 x,y,z>0,xyz=1 x , y , z > 0 x y z = 1 的條件下,求解 ( x ? 2 / 3 ) / ( x + y + z ? 2 ) (x-2/3)/(x+y+z-2) ( x ? 2 / 3 ) / ( x + y + z ? 2 ) 的最小值。

            
              
                from
              
               scipy
              
                .
              
              optimize 
              
                import
              
               minimize

              
                import
              
               numpy 
              
                as
              
               np
e 
              
                =
              
              
                1e
              
              
                -
              
              
                10
              
              
                # 非常接近0的值
              
              
fun 
              
                =
              
              
                lambda
              
               x 
              
                :
              
              
                (
              
              x
              
                [
              
              
                0
              
              
                ]
              
              
                -
              
              
                0.667
              
              
                )
              
              
                /
              
              
                (
              
              x
              
                [
              
              
                0
              
              
                ]
              
              
                +
              
               x
              
                [
              
              
                1
              
              
                ]
              
              
                +
              
               x
              
                [
              
              
                2
              
              
                ]
              
              
                -
              
              
                2
              
              
                )
              
              
                # 約束函數
              
              
cons 
              
                =
              
              
                (
              
              
                {
              
              
                'type'
              
              
                :
              
              
                'eq'
              
              
                ,
              
              
                'fun'
              
              
                :
              
              
                lambda
              
               x
              
                :
              
               x
              
                [
              
              
                0
              
              
                ]
              
              
                *
              
               x
              
                [
              
              
                1
              
              
                ]
              
              
                *
              
               x
              
                [
              
              
                2
              
              
                ]
              
              
                -
              
              
                1
              
              
                }
              
              
                ,
              
              
                # xyz=1
              
              
                {
              
              
                'type'
              
              
                :
              
              
                'ineq'
              
              
                ,
              
              
                'fun'
              
              
                :
              
              
                lambda
              
               x
              
                :
              
               x
              
                [
              
              
                0
              
              
                ]
              
              
                -
              
               e
              
                }
              
              
                ,
              
              
                # x>=e,即 x > 0
              
              
                {
              
              
                'type'
              
              
                :
              
              
                'ineq'
              
              
                ,
              
              
                'fun'
              
              
                :
              
              
                lambda
              
               x
              
                :
              
               x
              
                [
              
              
                1
              
              
                ]
              
              
                -
              
               e
              
                }
              
              
                ,
              
              
                {
              
              
                'type'
              
              
                :
              
              
                'ineq'
              
              
                ,
              
              
                'fun'
              
              
                :
              
              
                lambda
              
               x
              
                :
              
               x
              
                [
              
              
                2
              
              
                ]
              
              
                -
              
               e
              
                }
              
              
                )
              
              
x0 
              
                =
              
               np
              
                .
              
              array
              
                (
              
              
                (
              
              
                1.0
              
              
                ,
              
              
                1.0
              
              
                ,
              
              
                1.0
              
              
                )
              
              
                )
              
              
                # 設置初始值
              
              
res 
              
                =
              
               minimize
              
                (
              
              fun
              
                ,
              
               x0
              
                ,
              
               method
              
                =
              
              
                'SLSQP'
              
              
                ,
              
               constraints
              
                =
              
              cons
              
                )
              
              
                print
              
              
                (
              
              
                '最小值:'
              
              
                ,
              
              res
              
                .
              
              fun
              
                )
              
              
                print
              
              
                (
              
              
                '最優解:'
              
              
                ,
              
              res
              
                .
              
              x
              
                )
              
              
                print
              
              
                (
              
              
                '迭代終止是否成功:'
              
              
                ,
              
               res
              
                .
              
              success
              
                )
              
              
                print
              
              
                (
              
              
                '迭代終止原因:'
              
              
                ,
              
               res
              
                .
              
              message
              
                )
              
            
          

輸出:

            
              最小值: -0.18814357989751096
最優解: [0.29250894 1.84897232 1.84897233]
迭代終止是否成功: True
迭代終止原因: Optimization terminated successfully.

            
          

備注:

  • 若是求一個函數的最大值,則改為求其相反數的最小值。
  • 因為 ineq 的約束是表示非負,所以 x > 0 x>0 x > 0 的條件可以寫為 x ? e ≥ 0 x-e\ge0 x ? e 0 ,其中 e e e 是一個盡可能小的值。
  • 其實,在本題中,可以直接讓 x > 0 x\gt0 x > 0 ,因為有約束 x y z = 1 xyz=1 x y z = 1 ,所以不必擔心最后解為 x = 0 x=0 x = 0

函數介紹

scipy.optimize.minimize (fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)

求取一個函數的最小值。函數的參數可以是多個,但函數值只能是標量。

參數

  • fun : callable
    目標函數
  • x0 : ndarry
    初始值
  • args : tuple, optional
    額外的參數,傳給目標函數和它的導數。
  • method : str or callable, optional
    求解問題的算法名,下面選其一:
    Nelder-Mead , Powell , CG , BFGS , Newton-CG , L-BFGS-B , TNC , COBYLA , SLSQP , dogleg , trust-ncg
    默認是 BFGS , L-BFGS-B , SLSQP 之一,根據問題是否含有約束和界限自動選擇。
  • jac : bool or callable, optional
    目標函數的梯度矩陣。只適用于 CG , BFGS , Newton-CG , L-BFGS-B , TNC , SLSQP , dogleg , trust-ncg 。如果 jac 是一個 Boolean 且為 True ,則 fun 被認為是梯度與目標函數一起返回。如果是 False ,則梯度會被自動地計算。 jac 也可以是一個函數,返回目標函數的梯度,且參數必須與 fun 相同。
  • hess , hessp : callable, optional
    目標函數的二階導矩陣,或者二階導矩陣乘以一個隨機向量 p 。只適用于 Newton-CG , dogleg , trust-ncg hess hessp 只需要給出一個即可。如果提供了 hess ,則 hessp 會被忽略。如果兩者都沒有提供,則二階導矩陣會被自動計算。
  • bounds : sequence, optional
    bounds 是參數的界限,只適用于 L-BFGS-B , TNC SLSQP ,每個參數對應一個 (min, max) ,表示參數的上下限。如果只有一邊界限,則另一邊置為 None 。當約束是針對 x x x 中的單個元素的上下限時,就可以用 bounds 參數來設置。
  • constraints : dict or sequence of dict, optional
    約束定義,只適用于 COBYLA SLSQP 。每個約束定義為一個詞典,鍵值對包括:
    • fun : callable。定義了約束函數。
    • type : str。約束類型: eq ’ 表示等式約束( fun 等于0), ineq 表示不等式約束( fun 大于等于0)。 COBYLA 只支持不等式約束。
    • jac : callable, optional。 fun 的梯度矩陣,只適用于 SLSQP
    • args : sequence, optional。傳遞給 fun jac 的額外參數。
  • tol : float, optional
    迭代終止的允許誤差。
  • options : dict, optional
    求解器的選項字典。所有的算法都接受以下的通用選項:
    • maxiter : int。迭代的最大次數。
    • disp : bool。如果是 True 則打印出收斂信息。
  • callback : callable, optional
    每次迭代之后調用的函數,參數為 xk ,表示當前的參數向量。

返回值

res:優化結果。

優化結果是 OptimizeResult 對象,重要屬性如下:

  • fun 是最優值。
  • x 是最優解。
  • success 表示求解器是否成功退出。
  • message 描述了求解器退出的原因。

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品天堂一区二区三区 | 欧美一区二区影院 | 国产二级毛片 | 麻豆精品视频 在线视频 | 久久久久久久国产精品毛片 | 亚洲欧美综合一区 | 国产成年网站v片在线观看 国产成人 免费观看 | 国产成人综合亚洲欧洲色就色 | 中文字幕一区婷婷久久 | 综合网在线观看 | 成年网站视频在线观看 | 久久久久一级片 | 国产真实乱xxxav | 日日狠狠 | 国产一区二区三区在线观看精品 | 成人a毛片手机免费播放 | 国产成人91高清精品免费 | 狠狠色噜狠狠狠狠色综合久 | 日本高清一 | 色汉综合| 99国产精品免费观看视频 | 视频一区色眯眯视频在线 | 欧美日韩在线视频一区 | 中文字幕日本精品一区二区三区 | 日韩精品区 | 四虎高清在线精品免费观看 | 欧美久久网 | 香蕉碰碰人人a久久动漫精品 | 国产成人精品高清不卡在线 | 欧美毛片又粗又长又大 | 亚洲免费黄色网 | 国产福利在线观看视频 | 欧美日韩国产人成在线观看 | 一级毛片视频免费 | 久久久精品2021免费观看 | 在线精品国产一区二区 | 欧美视频在线观看 | 老子影院午夜伦不卡不四虎卡 | 国产第二区 | 二级片毛片 | 四虎影视永久免费 |