矩阵乘法在Python中给出了不正常的结果(SciPy / PyLab)

时间:2011-02-05 23:38:18

标签: python matrix numpy scipy linear-algebra

我是Python的新手,我的线性代数有点生疏,所以这可能是一个简单的问题。我正在尝试在Matrix上实现泰勒级数展开以计算exp(A),其中A只是一个简单的3x3矩阵。此扩展的公式BTW是sum(A ^ n / n!)。

我的例行工作正常,直到n = 9,但在n = 10时,矩阵中的数字突然变为负数。这就是问题所在。

  
    
      

A ** 9       矩阵([[250130371,506767656,688136342],               [159014912,322268681,437167840],               [382552652,775012944,1052574077]])

             

A ** 10       矩阵([[ - 1655028929,1053671123,-1327424345],               [1677887954,-895075635,319718665],               [-257240602,-409489685,-1776533068]])

    
  

直观地,A ^ 9 * A应该为矩阵的每个成员生成更大的数字,但正如您所看到的,A ^ 10没有给出该结果。

有什么想法吗?

from scipy import *
from numpy import *
from numpy.linalg import *
#the matrix I will use to implement exp(A)
A = mat('[1 3 5; 2 5 1; 2 3 8]')
#identity matrix
I = mat('[1 0 0; 0 1 0; 0 0 1]')
#first step in Taylor Expansion (n=0)
B = I
#second step in Taylor Expansion (n=1)
B += A
#start the while loop in the 2nd step
n = 2
x=0
while x<10:
    C = (A**n)/factorial(n)
    print C
    print " "
    n+=1
    B+= C
    print B
    x+=1

print B

感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:8)

您的矩阵是使用int32类型的元素(32位整数)创建的。您可以通过打印A.dtype的值来查看此内容。 32位整数只能保存最多约20亿的值,因此它们会回绕到负值。

如果64位整数足够大,则可以改为使用它们:

A = mat('[1 3 5; 2 5 1; 2 3 8]', dtype=numpy.int64)

否则,您可以使用浮点数。它们具有更大的最大值,但精度有限,因此可能存在一些不准确之处。

A = mat('[1 3 5; 2 5 1; 2 3 8]', dtype=float)

在这种情况下,浮点可能是最佳选择,因为您不希望在除以n!之后结果为整数。

答案 1 :(得分:3)

我对科学蟒蛇知之甚少,但我确实知道出了什么问题。似乎矩阵元素表示为32位有符号整数。这意味着它们被限制在范围-2 ^ 31&lt; = x&lt; 2 ^ 31。在A ^ 10,数字变得太大而且它们“环绕”。我查了一下,左上角系数实际上是2639938267,当它缠绕时,给出了2639938267 - 2 ^ 32 = -1655028929。

我不知道如何在python中设置数据类型,所以我不知道如何解决这个问题。不过我确信这是可能的。

(我还建议你试试sage:www.sagemath.org,这是基于python的数学软件。它会自动使用无限精度。这就是我现在检查这些数字的方法。)

祝你好运!蒂莫