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

Taj*_*j G 5 python numpy matrix linear-algebra scipy

我是Python的新手,我的线性代数有点生疏,所以这可能是一个简单的问题.我正在尝试在Matrix上实现泰勒级数展开以计算exp(A),其中A只是一个简单的3x3矩阵.该扩展的公式BTW是总和(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
Run Code Online (Sandbox Code Playgroud)

谢谢你提供的所有帮助!

int*_*jay 8

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

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

A = mat('[1 3 5; 2 5 1; 2 3 8]', dtype=numpy.int64)
Run Code Online (Sandbox Code Playgroud)

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

A = mat('[1 3 5; 2 5 1; 2 3 8]', dtype=float)
Run Code Online (Sandbox Code Playgroud)

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