0


我在这里用solve() 代码 成功求解了一个未知变量:

x = 1000  
y = Symbol('y')  
w = 2.84 * x > x + y, 1.7 * y > x + y  
solve(w)  

现在我试图从 Pandas 数据框中获得相同的结果,但没有成功。

df = pd.DataFrame({'A': pd.Series([2.84]),'B': pd.Series([1.7])})  
A = Symbol('A')  
B = Symbol('B')
C = 1000
y = Symbol('y')  
expr = A * C > C + y, B * y > C + y  
f = lambdify([A,B],expr, modules="sympy")
f(df['A'],df['B'])  

我收到错误 - NameError: name 'y' is not defined
这很奇怪,因为 'y' 是我正在寻找的。

4

1 回答 1

0

lambdify函数不解决任何问题,它只评估。要评估您的expr,它需要知道 A、B 和 y。您没有提供 y,因此出现错误。

如果目标是从 A 和 B 确定 y,您应该首先根据 A 和 B 获得 y 的公式,大概使用 的输出solve。然后对该公式进行lambdify。

碰巧,solve无法解决多变量不等式。即使可以,也会有一系列可能的 y 值,并且lambdify需要一些具体的东西来评估。为了达到这个目的,我用 = 替换了 >,求解了方程,并返回了这些方程的平均值(它们是 y 的上限和下限,假设 B > 1,如您的示例中所示)。

A = Symbol('A')  
B = Symbol('B')
C = 1000
y = Symbol('y')  
expr = (A * C > C + y, B * y > C + y)
upper = solve(expr[0].replace(Gt, Eq), y, dict=True)[0][y]
lower = solve(expr[1].replace(Gt, Eq), y, dict=True)[0][y]
f = lambdify((A, B), (upper+lower)/2)

现在 f 是一个带有两个参数的 lambda,它返回 y 的可能值区间的中点。

import pandas as pd
df = pd.DataFrame({'A': pd.Series([2.84, 3.24]),'B': pd.Series([1.7, 2.12])}) 
f(df['A'], df['B'])

返回

0    1634.285714
1    1566.428571
dtype: float64
于 2018-01-31T23:31:21.540 回答