繁体   English   中英

如何创建 Excel Solver valueof function 的等价物?

[英]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}

谁能帮我解决这个等式?

你得到的答案并不奇怪,它只是你所问的答案。 你有一个关于两个变量xy的方程,这个问题的解决方案通常不是唯一的(有时是无限的)。 现在,您可以添加一个额外的条件(例如不等式)或更改可能解的数值域(如丢番图方程)。 您可以在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM