首页 > 解决方案 > Scipy优化只是不处理界限

问题描述

我正在尝试为许多不同的 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,为什么有时为正有时为负?

标签: pythonoptimizationscipyconstraints

解决方案


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

推荐阅读