我是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
感谢您提供任何帮助!
答案 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的数学软件。它会自动使用无限精度。这就是我现在检查这些数字的方法。)
祝你好运!蒂莫