1

2*2 オーダーの 2 つの行列を乗算しようとしています。行列の 1 つに未知のパラメータ "k1" が含まれています。k1のどの値に対して満足できる解を確認したい。2 つの行列の積は、3 番目の行列と等しくなります。注:乗算を行列として操作したい線形関係または方程式のセットに変換したくありません。

ここが私が立ち往生している場所です。

k1 = Int ('k1')

x = [ [ Int("x_%s_%s" % (i+1, j+1)) for j in range(2) ] 
     for i in range(2) ]

a =((1,k1),(3,4))

b =((1,1),(1,1))

c= ((3,3),(7,7))

s = Solver()
s.add(a[0][1]>0)
s.add(a*b==c)
if s.check() == sat:
m = s.model()
r = [ [ m.evaluate(x[i][j]) for j in range(2) ] 
      for i in range(2) ]
print_matrix(r)
else:
print "failed to solve"

方法はありますか?

4

1 に答える 1

1

1つの可能な解決策は

k1 = Int ('k1')

x = [ [ Int("x_%s_%s" % (i+1, j+1)) for j in range(2) ] 
 for i in range(2) ]

a =((1,k1),(3,4))

b =((1,1),(1,1))

c= ((3,3),(7,7))

s = Solver()
eq1= a[0][1]>0
eq2 =[[sum(a[i][k]*b[k][j] for k in range(2)) == c[i][j] for i in range(2) ]
         for j in range(2) ]
s.add(eq1)
s.add(eq2[0][0])
s.add(eq2[0][1])
s.add(eq2[1][0])
s.add(eq2[1][1])
print s             
print s.check()             
m = s.model()
print m

対応する出力は

[k1 > 0, 1 + k1*1 == 3, True, 1 + k1*1 == 3, True] 
sat 
[k1 = 2]

この例をここでオンラインで実行してください

于 2014-04-15T02:13:06.360 に答える