Pythonのcvxpyプログラムを関数にする方法を教えて下さい


(参考)2010年度 京都大・文系数学第2問 問題と解答  
<https://www.densu.jp/kyoto/10kyotolpass.pdf#page=2>  
<https://www.densu.jp/kyoto/10kyotolpass.pdf#page=7>  
(参考)シンプルな最適化問題を解いてみる(その2)  
<https://myenigma.hatenablog.com/entry/2016/11/06/114603>  
(参考)4 _x+y <= 9, x+2_y >= 4,2 _x-3_ y >= -6  
[https://www.wolframalpha.com/input/?i=4*x%2By+%3C%3D+9%2C+x%2B2*y+%3E%3D+4%2C2*x-3*y+%3E%3D+-6&lang=ja](https://www.wolframalpha.com/input/?i=4*x%2By+%3C%3D+9%2C+x%2B2*y+%3E%3D+4%2C2*x-3*y+%3E%3D+-6&lang=ja)

以下は、うごきました。

[code]

    import cvxpy
    import numpy as np
    x = cvxpy.Variable()
    y = cvxpy.Variable()
    A = cvxpy.Problem(cvxpy.Maximize( 2*x + y ), [4*x+y <= 9, x+2*y >= 4,2*x-3*y >= -6]).solve()
    print("# x,y,Max:", np.round(x.value,3), np.round(y.value,3),np.round(A,3))
    A = cvxpy.Problem(cvxpy.Minimize( 2*x + y ), [4*x+y <= 9, x+2*y >= 4,2*x-3*y >= -6]).solve()
    print("# x,y,Min:", np.round(x.value,3), np.round(y.value,3),np.round(A,3))
    # x,y,Max: 1.5 3.0 6.0
    # x,y,Min: 0.0 2.0 2.0
    
[/code]

以下が、うごきません。関数にしたいソースコードです。

[code]

    import cvxpy
    import numpy as np
    def myMax_cvxpy(my_objective,my_constraints):
        Ans = cvxpy.Problem(cvxpy.Maximize( my_objective ), my_constraints).solve()
        return Ans
    def myMin_cvxpy(my_objective,my_constraints):
        Ans = cvxpy.Problem(cvxpy.Miniimize( my_objective ), my_constraints).solve()
        return Ans
    my_Ans = myMax_cvxpy(2*x + y , [4*x+y <= 9, x+2*y >= 4,2*x-3*y >= -6])
    print("# x,y,Max:", my_Ans[0],my_Ans[1],my_Ans[1])
    my_Ans = myMin_cvxpy(2*x + y , [4*x+y <= 9, x+2*y >= 4,2*x-3*y >= -6])
    print("# x,y,Min:", my_Ans[0], my_Ans[1], my_Ans[1])
    
[/code]




関数部分は間違っていませんが、その場合のメインルーチンはこのような形になると思います：

[code]

    x = cvxpy.Variable()
    y = cvxpy.Variable()
    my_Ans = myMax_cvxpy(2*x + y , [4*x+y <= 9, x+2*y >= 4,2*x-3*y >= -6])
    print("# x,y,Max:", np.round(x.value,3), np.round(y.value,3), np.round(my_Ans, 3))
    my_Ans = myMin_cvxpy(2*x + y , [4*x+y <= 9, x+2*y >= 4,2*x-3*y >= -6])
    print("# x,y,Max:", np.round(x.value,3), np.round(y.value,3), np.round(my_Ans, 3))
    
[/code]

関数化した部分は `my_Ans`（元のプログラムでは `A`）として戻ってくる値だけなので、その他は元のプログラムと同じになります。




関数部分は間違っていませんが、その場合のメインルーチンはこのような形になると思います：

[code]

    x = cvxpy.Variable()
    y = cvxpy.Variable()
    my_Ans = myMax_cvxpy(2*x + y , [4*x+y <= 9, x+2*y >= 4,2*x-3*y >= -6])
    print("# x,y,Max:", np.round(x.value,3), np.round(y.value,3), np.round(my_Ans, 3))
    my_Ans = myMin_cvxpy(2*x + y , [4*x+y <= 9, x+2*y >= 4,2*x-3*y >= -6])
    print("# x,y,Max:", np.round(x.value,3), np.round(y.value,3), np.round(my_Ans, 3))
    
[/code]

関数化した部分は `my_Ans`（元のプログラムでは `A`）として戻ってくる値だけなので、その他は元のプログラムと同じになります。

