Z3:执行矩阵运算

时间:2013-03-24 13:27:40

标签: matrix z3 theorem-proving

我的情况

我正在开展一个需要的项目:

我的问题

  • 使用矩阵运算表达公式的最佳方法是什么 他们可以通过z3来解决? (Z3Py's Sudoku Example中使用的方式不是 非常优雅,似乎不适合更复杂的矩阵 操作)。

感谢。 - 如果有任何不清楚的地方,请留下问题评论。

1 个答案:

答案 0 :(得分:3)

Z3不支持这样的矩阵,因此对它们进行编码的最佳方法是对它们所代表的公式进行编码。这与Sudoku示例编码事物的方式大致相同。这是一个使用例如2x2实矩阵(Z3py链接:http://rise4fun.com/Z3Py/MYnB)的简单示例:

# nonlinear version, constants a_ij, b_i are variables
# x_1, x_2, a_11, a_12, a_21, a_22, b_1, b_2 = Reals('x_1 x_2 a_11 a_12 a_21 a_22 b_1 b_2')

# linear version (all numbers are defined values)
x_1, x_2 = Reals('x_1 x_2')

# A matrix
a_11 = 1
a_12 = 2
a_21 = 3
a_22 = 5

# b-vector
b_1 = 7
b_2 = 11

newx_1 = a_11 * x_1 + a_12 * x_2 + b_1
newx_2 = a_21 * x_1 + a_22 * x_2 + b_2

print newx_1
print newx_2

# solve using model generation
s = Solver()
s.add(newx_1 == 0) # pointers to equations
s.add(newx_2 == 5)
print s.check()
print s.model()

# solve using "solve"
solve(And(newx_1 == 0, newx_2 == 5))

要让Z3求解未知矩阵实体,取消注释第二行(使用a_11,a_12等符号名称),在第五行注释x_1,x_2的其他符号定义,并注释具体分配给a_11 = 1等。然后你会通过找到令人满意的这些变量赋值来让Z3解决任何未知数,但请注意,你可能需要为你的目的启用模型完成(例如,如果你需要分配给所有的未知的矩阵参数或x_i变量,参见例如:Z3 4.0: get complete model)。

然而,根据您所分享的链接,您有兴趣使用正弦波(旋转)执行操作,这些操作通常具有超越性,此时Z3不支持超越(一般指数等)。这对您来说将是一个具有挑战性的部分,例如,证明操作有效的旋转角度的任何选择,或者甚至只是编码旋转。缩放和翻译不应该太难编码。

另外,请参阅以下答案,了解如何编码线性微分方程,它是x'= Ax形式的方程式,其中A是n * n矩阵,x是n维向量:Encoding of first order differential equation as First order formula