74882


(参考)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]


CC BY-SA 4.0
2021-03-24T10:53:13.970
74862
2021-03-29T10:51:35.563
2021-03-25T04:48:40.043
3060
17199
question
python
Pythonのcvxpyプログラムを関数にする方法を教えて下さい


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

[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`）として戻ってくる値だけなので、その他は元のプログラムと同じになります。


CC BY-SA 4.0
2021-03-25T04:35:16.763
74882
2021-03-25T04:35:16.763
7290
74862
answer


英語版における以下のページを参考にしました。

(参考)  
<https://stackoverflow.com/questions/52683842/cvxpy-vector-constraints>

[code]

    import cvxpy as cvx
    import numpy as np
    def myMax_cvxpy(my_objective,my_constraints):
        prob = cvx.Problem(cvx.Maximize(my_objective), my_constraints)
        A = prob.solve()
        my_ans=np.append(x.value,A)
        return my_ans
    def myMin_cvxpy(my_objective,my_constraints):
        prob = cvx.Problem(cvx.Minimize(my_objective), my_constraints)
        A = prob.solve()
        my_ans=np.append(x.value,A)
        return my_ans
    x = cvx.Variable(2)
    objective = 2*x[0] + x[1]
    constraints = [4*x[0]+x[1] <= 9, x[0]+2*x[1] >= 4,2*x[0]-3*x[1] >= -6]
    print("# 最大値",myMax_cvxpy(objective , constraints))
    print("# 最小値",myMin_cvxpy(objective , constraints))
    print("# 最大値",np.round((myMax_cvxpy(objective , constraints)),3))
    print("# 最小値",np.round((myMin_cvxpy(objective , constraints)),3))
    # 最大値 [1.5        2.99999998 5.99999998]
    # 最小値 [2.91004066e-10 2.00000000e+00 2.00000000e+00]
    # 最大値 [1.5 3.  6. ]
    # 最小値 [0. 2. 2.]
    
[/code]


CC BY-SA 4.0
2021-03-29T10:11:58.657
74966
2021-03-29T10:51:35.563
2021-03-29T10:51:35.563
3060
17199
74862
answer