【发布时间】:2016-01-29 22:27:57
【问题描述】:
如果这个问题措辞不当,我深表歉意,但我正在尝试使用 z3(在带有语言绑定的 python 中)求解一些非线性方程,但不幸的是,qfnra-nlsat 和通用求解器都无法求解以下系统除非 a、b 和 c 都给出:
y == 0.001 * (a ** 2.07) * (b ** 0.9) * (c ** 0.7) + 0.002
y > 0.0
我尝试了以下策略:
t = z3.Then('simplify', 'qfnra-nlsat')
我还尝试用一些中间名称替换非线性部分,然后使用 push() 使用增量求解器将指数部分添加回来。但在这两种情况下,z3 基本上都会卡住(据我尝试超过 1 小时)。
我是 CSP 的新手和所涉及的理论背景,很抱歉,如果这是一个愚蠢的问题,但我想知道这种非线性是否超出了 z3 (经验上)可以解决的问题,或者我没有正确使用它?谢谢!
编辑:
这是在我的机器上失败的 python 代码:
import z3
a = z3.Real('a')
b = z3.Real('b')
c = z3.Real('c')
y = z3.Real('y')
eq = [
y == 0.001 * (a ** 2.07) * (b ** 0.9) * (c ** 0.7) + 0.002,
y >= 0.0
]
t = z3.Then('simplify', 'qfnra-nlsat')
s = t.solver()
s.add(eq)
r = s.check()
print r
m = s.model()
print m
这是输出:
unknown
[y = 1/500 ]
编辑:
z3 git repo 的最新代码似乎有点坏了。我尝试了 4.4.1 版本,一切顺利。
不过,如果我在下面再添加一个约束条件,请提出一个后续问题:
a == 16.0
z3 卡住了,我无法理解...似乎上面的附加约束非常微不足道,b 和 c 都是 1 的初始猜测应该可以解决系统问题,但我想这不是 z3 的工作方式?关于如何用这个新约束解决系统的任何想法?
【问题讨论】:
-
忘了说,当 a、b 和 c 都给出时,z3 会卡住。如果我遗漏任何 rhs 变量或为 y 赋值,z3 将放弃并立即返回 unknown。
-
另外,我将所有变量声明为 Real 类型。