Python Scipy优化只是不处理边界

Python Scipy优化只是不处理边界,python,optimization,scipy,constraints,Python,Optimization,Scipy,Constraints,我试图为K的许多不同值解决以下问题: 我正在尝试使用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])*

我试图为K的许多不同值解决以下问题:

我正在尝试使用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,为什么有时是正的,有时是负的?

改变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}

作为旁注,如果
K>=0
x1=x2=1
似乎是最优的,否则这个问题似乎不可行。@hilberts\u问题,你是对的。我已经纠正了这个问题。但是你仍然可以看到,它没有给出正确的答案。在查看级别之前,请始终检查结果的状态。