python - Scipy优化只是不处理界限
问题描述
我正在尝试为许多不同的 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}
推荐阅读
- sql-server - SELECT INTO 中断 DDL/DML 触发器,但 CREATE TABLE 后跟 INSERT 有效吗?
- go - 在 Go 中嵌入的惯用方式是什么(与经典 OOP 不同)?
- python - ImportError with SeqIO from Biopython in Spyder
- java - CORDA 无法将状态更改为在流中使用
- docker - 微服务中的服务发现与 docker 中的服务发现
- c# - Select() 性能下降
- python - django 会自动处理自动转义和上下文感知吗?
- java - 在控制器类中模拟的服务层正在执行实际的方法实现
- sql-server - 在 where 子句中使用 T 逗号 (Ț)
- python-3.x - Pandas - 根据 NaN 的数量有条件地删除重复项