python - 如何修复 Python Gekko 方程错误 "SyntaxError: keyword can' t be an expression”?

标签 python solver nonlinear-optimization gekko

我在 Python Gekko 程序中遇到一个错误,提示方程有问题。我知道这个单位圆与直线相交的问题有两种解法。

enter image description here

from gekko import GEKKO
m = GEKKO()
x = m.Var()
y = m.Var()
m.Equation(x**2+y**2=1)
m.Equation(x=y)
m.solve()

当我将方程放在一起时,它给出了不同的错误 SyntaxError: invalid syntax

from gekko import GEKKO
m = GEKKO()
x = m.Var()
y = m.Var()
m.Equations([x**2+y**2=1,x=y])
m.solve()

我可以通过将方程包含为目标函数来获得解,但如果我给出初始猜测,求解器 IPOPT 会报告 x=0, y=0。当我猜测 x=1, y=1 时,它给出了一个正确的解决方案作为 x=0.707, y=0.707。我想让求解器强制执行这些约束(而非软约束)。

m.Obj((x**2+y**2-1)**2)
m.Obj((x-y)**2)

如何使用 Python Gekko 解决这个问题?

最佳答案

像 David 提到的那样,在你的方程式中使用 ==

from gekko import GEKKO
m = GEKKO()
x = m.Var()
y = m.Var()
m.Equation(x**2+y**2==1)
m.Equation(x==y)
m.solve()

编写方程式时的一个常见错误是使用单个等号 (=) 而不是双等号 (==)。 (=) 将右侧的数量分配给左侧的变量。 (==) 是比较运算符,在 Gekko 中用于构建等式约束。您还可以使用其他运算符,例如 (<=)、(<)、(>) 和 (>=)。 Gekko 不支持不等于 (!=)。

对于你的问题要考虑的另一件事是你从 x=0y=0 开始,当你没有给出一个起始猜测时 x=m.Var()y=m.Var()。您可以从更接近解决方案的地方开始找到一个或另一个解决方案,例如 x=m.Var(1)y=m.Var(1) 或添加约束将搜索空间限制为 x=m.Var(lb=0)y=m.Var(lb=0)

关于python - 如何修复 Python Gekko 方程错误 "SyntaxError: keyword can' t be an expression”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575866/

相关文章:

python - 将 n 维数组缩减为带有附加列的二维数组

python - 使用 pyparsing 解析类似 JSON 的格式

vba - SolverOptions : How to find the parameter position (AssumeNonNeg)?

python - 有关为Vexed关卡编写解算器的建议

matlab - 使用 fmincon() 求解矩阵形式的非线性程序

r - 使用 nloptr 找到 N 个最佳解决方案

python - 对于不可行的 NLP,Scipy.optimize 成功终止

python - 批量大小可变的 TensorFlow 数据集 `from_generator`

python - 为 concurrent.futures.ProcessPoolExecutor 播种 numpy.random 的 default_rng 和 SeedSequence 对象

python - 如何使用 Python 根据数据集的列查找动态函数的根