Scipy优化只是不处理边界

问题描述 投票:0回答:1

我正在尝试针对许多不同的K值解决以下问题:

\max_{p_2\sqrt{1-x_1} + (1-p_2)\sqrt{1-x_2}\geq K} p_1 \sqrt{x_1} + (1-p1) \sqrt{x_2}

我正在尝试使用scipy优化来提高通用性(在某个阶段,我希望能够更改功能)。

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
from scipy import optimize

n=10

p1 = 0.2
p2 = 0.3
orig = (0,0)
endw = (1,1)

def U1(x):
    return p1*(x[0])**0.5 + (1-p1)*(x[1])**0.5
def U2(x):
    return p2*(1-x[0])**0.5 + (1-p2)*(1-x[1])**0.5


itervals = np.linspace(endw, orig, n)
utvals = np.array([U2(vec) for vec in itervals])
parvals = np.zeros((2, len(utvals)))

for it in range(len(utvals)):
    def obj(x):
        return -U1(x)
    def constr(x):
        return -U2(x)+utvals[it]
    con = {'type': 'eq', 'fun': constr}
    res = optimize.minimize(obj, itervals[it], method='SLSQP', constraints=con)
    parvals[:, it] = res['x']
    print(constr(parvals[:,it]), utvals[it])

但是,当我检查约束是否得到遵守时,我在上面的代码中获得了constr(parvals[:,it])的负值,并且如果将约束设为

    def constr(x):
        return U2(x)-utvals[it]

我得到constr(parvals[:,it])的正值。怎么会来?

[我的意思是,我的最初猜测(包含在itervals中)对于约束始终返回0。因此,总有可能达到0,为什么有时为正,有时为负?

python optimization scipy constraints
1个回答
0
投票

改变K,我们发现不同的解对(x1,x2)。用拉格朗日乘子(施加一阶条件)解决最大化问题,很容易看到x2必须是x1的函数,即,此代码给出了所需的关系:

Psi = (p1/p2*(1-p2)/(1-p1))**2
def realline(x1):
    return x1/(Psi+(1-Psi)*x1)

很容易看出,用正确的符号定义约束,解决方案几乎在所有地方都重合:

    def constr(x):
        return U2(x)-utvals[it]
    con = {'type': 'ineq', 'fun': constr}
© www.soinside.com 2019 - 2024. All rights reserved.