[英]How to create the equivalent of Excel Solver valueof function?
我有以下等式:
x/0,2 * (0,2+1)+y/0,1*(0,1+1) = 26.34
X 和 Y 的初始值分别设置为 4.085 和 0.17。 我需要找到 X 和 Y 的值,它们满足方程并且与初始设定值的共同偏差最小。 换句话说,|4.085 - x| 的总和和 |0.17 - y| 被最小化。
使用 Excel Solver Valueof Function 这很容易找到:我们在公式结果中插入 x 和 y 作为要更改为 26 的变量
这是我的 python 代码(我正在尝试为此使用 sympy)
x,y = symbols('x y')
eqn = solve([Eq(x/0.2*(0.2+1)+y/0.1*(0.1+1),26)],x,y)
print(eqn)
但是我得到了奇怪的结果{x: 4.33333333333333 - 1.83333333333333*y}
谁能帮我解决这个等式?
你得到的答案并不奇怪,它只是你所问的答案。 你有一个关于两个变量x
和y
的方程,这个问题的解决方案通常不是唯一的(有时是无限的)。 现在,您可以添加一个额外的条件(例如不等式)或更改可能解的数值域(如丢番图方程)。 您可以在 Sympy 中执行它们中的任何一个,在以下示例中,我使用solveset在 Real 域中找到您的问题的x
解决方案:
from sympy import symbols, Eq, solveset
x,y = symbols('x y')
eqn = solveset(Eq(1.2 * x / 0.2 + 1.1 * y / 0.1, 26), x, Reals)
print(eqn)
Output:
Intersection(FiniteSet(4.33333333333333 - 1.83333333333333*y), Reals)
如您所见, x
上的解是有限集,即y
上的直线与实数之间的交点。 通过直接评估y
可以找到任何特定的解决方案。
这相当于说x = 4.33333333333333 - 1.83333333333333 * y
如果您在猜测值y = 0.17
中评估此等式,则获得x = 4.0216
(接近您的x = 4.085
4.085 猜测值)。
在分析了添加到您的问题中的新信息之后,我想我终于明白了:您的问题是有约束的优化。 现在,我不经常使用 Excel ,但我敢打赌,在幕后,这种优化是使用Lagrange multipliers进行的。 在您的特定情况下,目标 function 表示解决方案 ( x, y
) 与点 (4.085, 0.17) 的偏差。 为方便起见,我选择了这个 function 作为它们之间的欧几里得距离(由于导数的不连续性,您建议的绝对值可能会出现问题)。 约束 function 就是您提供的方程式。 要使用 Sympy 解决这个问题,可以使用如下方法:
import sympy as sp
# Define symbols and functions
x, y, lamb = sp.symbols('x, y, lamb', real=True)
func = sp.sqrt((x - 4.085) ** 2 + (y - 0.17) ** 2) # Target function
const = 1.2 * x / 0.2 + 1.1 * y / 0.1 - 26 # Constraint function
# Define Lagrangian
lagrang = func - lamb * const
# Compute gradient of Lagrangian
grad_lagrang = [sp.diff(lagrang, var) for var in [x, y, lamb]]
# Solve the resulting system of equations
spoints = sp.solve(grad_lagrang, [x, y, lamb], dict=True)
# Print stationary points
print(spoints)
Output:
[{x: 4.07047770700637, lamb: -0.0798086884467563, y: 0.143375796178345}]
因为在我们的例子中只找到了一个固定点,所以这是最优解(尽管这只是一个必要条件)。 可以放弃lamb
乘数的值,因此x, y = 4.070, 0.1434
。 希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.