我正在尝试针对许多不同的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}