python - 显式创建字典列表与使用循环迭代为 lambda 表达式创建字典
问题描述
考虑一个黑盒函数 f,它输入 x 并返回一个实数 a。
def foo(x): ... return a
我们知道 f 是 x 的确定性函数。认为
x = []
for i in range(2):
x.append({'type': 'eq', 'fun': lambda x: x[i] + x[3+i] - 1000})
和
y = [{'type': 'eq', 'fun': lambda x: x[0] + x[3+0] - 1000},
{'type': 'eq', 'fun': lambda x: x[1] + x[3+1] - 1000}
]
我明白了foo(x) != foo(y)
,这意味着 x 与 y 不同。
怎么可能x
不一样y
?x
和 和有什么区别y
?
这是一个可验证且完整的示例:
import pandas as pd
import numpy as np
from scipy.optimize import minimize, Bounds
X0 = [0,0,0,0]
x = []
for i in range(2):
x.append({'type': 'eq', 'fun': lambda x: x[i] + x[2+i] - 1000})
y = [{'type': 'eq', 'fun': lambda x: x[0] + x[2] - 1000},
{'type': 'eq', 'fun': lambda x: x[1] + x[3] - 1000}
]
def f(a):
return a[0] + a[1] + a[2] + a[3]
print(minimize(f, X0, constraints=x,
bounds = bounds, options={'disp': False} ).x)
print(minimize(f, X0, constraints=y,
bounds = bounds, options={'disp': False} ).x)
这打印:
[724.07734394 500.0.500.]
[500。500. 500. 500.]
实际上, y 给出了正确的结果。为什么 x 给出不正确的结果?
回答我自己的问题:
做这个:
import pandas as pd
import numpy as np
from scipy.optimize import minimize, Bounds
X0 = [0,0,0,0]
x = []
for i in range(2):
x.append({'type': 'eq', 'fun': lambda a, i=i: a[i] + a[split+i] - 1000})
y = [{'type': 'eq', 'fun': lambda x: x[0] + x[2] - 1000},
{'type': 'eq', 'fun': lambda x: x[1] + x[3] - 1000}
]
def f(a):
return a[0] + a[1] + a[2] + a[3]
print(minimize(f, X0, constraints=x,
bounds = bounds, options={'disp': False} ).x)
print(minimize(f, X0, constraints=y,
bounds = bounds, options={'disp': False} ).x)
解决方案
推荐阅读
- java - Springfox 文档 - 单独章节中的全局标题
- r - 从R中的一个变量转置另一个变量
- .net - 当在“for”循环中添加项目时,如何立即通知绑定到 ObservableCollection 的 DataGrid?
- javascript - 在 Javascript Daypilot 调度程序中重置“args”
- python - numpy.AxisError:轴 1 超出维度 1 数组的范围?
- ruby-on-rails - 从 rails 4.2.0 升级到 5.0.0 和 Ruby 从 2.2.4 到 2.5.8 - 自动加载常量 Sub 时检测到循环依赖
- mule - MuleSoft 的一般开发最佳实践是什么
- reactjs - SyntaxError:无法在模块 React JS Antd 之外使用 import 语句
- javascript - 使用 jQuery 或 JavaScript 自动搜索 bootstrap-select
- javascript - 托管在 heroku 上的 MERN 应用程序的架构帮助