如何用python中的两个矩阵求解方程?

时间:2017-09-21 10:13:35

标签: python numpy scipy sympy

如果B =(1,0,0)(0,-1,0)(0,0,1)vowels = 'aeiou' def find_solutions(words): solutions = [] vowel_list = list(vowels) cases = [] for word in words: for i, l in enumerate(word): if l in vowel_list: c = list(word) temp = [] for vowel in vowel_list: c[i] = vowel temp.append(''.join(c)) cases.append(temp) for case in cases: if all([item in words for item in case]): if case not in solutions: solutions.append(case) return solutions 和A ^ 2 = 1的矩阵A. >

我尝试过这样做:A*B*A = B*A*B

sympy.solve(A*B*A - B*A*A)

我也试过numpy.linalg,但我没有任何结果

1 个答案:

答案 0 :(得分:2)

首先,linalg无济于事,因为这不是线性问题:未知A会自行乘以。您想要求解具有9个未知数的18个二次方程组的系统。对于通用系统,我们不期望任何解决方案,但这里有很多结构。

在我的SymPy版本(1.1.1)中,直接尝试解决甚至一个矩阵方程A*B*A=B*A*BA*A=I未能在合理的时间内完成。因此,让我们按照saintsfan342000的建议,以数字方式解决问题,作为最小化问题。我就这样做了:

import numpy as np
from scipy.optimize import minimize    
B = np.array([[1,0,0], [0,-1,0], [0,0,1]])
def func(A, B):
    A = A.reshape((3, 3))
    return np.linalg.norm(A.dot(B).dot(A)-B.dot(A).dot(B))**2 + np.linalg.norm(A.dot(A)-np.eye(3))**2
while True:
    guess = np.random.uniform(-2, 2, size=(9,))
    res = minimize(func, guess, args=(B,))
    if res.fun < 1e-15:
        A = res.x.reshape((3, 3))
        print(A)

要最小化的函数是A*B*A-B*A*BA*A-I的Frobenius范数的平方和。我将最小化放在一个循环中,因为有一些局部最小值会导致minimize卡住;所以当找到的最小值不足够接近零时,我忽略了结果并重新开始。运行一段时间后,脚本将打印一堆矩阵,如

[[ 0.70386835  0.86117949 -1.40305355]
 [ 0.17193376  0.49999999  0.81461157]
 [-0.25409118  0.73892171 -0.20386834]]

所有这些都有两个重要特征:

  • 中心元素A [1,1]为1/2
  • 矩阵的轨迹(对角元素的总和)为1。

让我们使用此信息来帮助SymPy解决系统问题。我仍然不想把两个方程都扔在它上面,所以我试着一次得到一个。

from sympy import *
var('a:h')                 #  a quick way to declare a bunch of symbols
B = Matrix([[1, 0, 0], [0, -1, 0], [0, 0, 1]])
A = Matrix([[a, b, c], [d, S(1)/2, f], [g, h, S(1)/2-a]])   # S(1)/2 is a way to get rational 1/2 instead of decimal 0.5
print(solve(A*B*A - B*A*B))
print(solve(A*A - eye(3))) 

现在solve成功并打印以下内容:

[{b: h*(4*f*h - 3)/(2*g), d: -g/(2*h), a: 2*f*h - 1/2, c: -f*h*(4*f*h - 3)/g}]
[{b: h*(4*f*h - 3)/(2*g), d: -g/(2*h), a: 2*f*h - 1/2, c: -f*h*(4*f*h - 3)/g}]

哇!根据我们在数值上发现的两个约束,两个矩阵方程都是等价的!我没想到的是。所以我们已经有了解决方案:

A = Matrix([[2*f*h - S(1)/2, h*(4*f*h - 3)/(2*g), -f*h*(4*f*h - 3)/g], [-g/(2*h), S(1)/2, f], [g, h, 1 - 2*f*h]])

任意f,g,h。

注意:A = B是一个简单的解决方案,上面被A [1,1] = 1/2的要求排除在外。我想这就是意图;看来你正在寻找对称群S 3 的忠实三维表示。