【问题标题】:Matrix multiplication gives unsual result in Python (SciPy/PyLab)矩阵乘法在 Python (SciPy/PyLab) 中给出了不寻常的结果
【发布时间】:2011-06-22 01:55:18
【问题描述】:

我是 Python 新手,对我的线性代数有点生疏,所以也许这是一个简单的问题。我正在尝试在矩阵上实现泰勒级数展开来计算 exp(A),其中 A 只是一个简单的 3x3 矩阵。顺便说一句,这个展开的公式是 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

感谢您提供的任何帮助!

【问题讨论】:

  • 大数变成负数听起来像是整数溢出。您是否尝试过设置具有更大整数类型的矩阵?
  • 您应该避免 from module import * 类型的导入。你刚刚用大量函数污染了你的命名空间。

标签: python matrix numpy scipy linear-algebra


【解决方案1】:

您的矩阵是使用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! 后的结果是整数。

【讨论】:

  • 另外,考虑到他正在做的计算,首先使用整数并没有多大意义。我猜他通过在C = (A**n)/factorial(n) 中使用整数(截断)除法引入了更多的不准确性。
  • @Joe:谢谢,我将其添加到我的答案中。我认为整数除法在这里不是问题,因为scipy.factorial 会返回浮点值,除非您传递exact=True 参数。
  • 谢谢您,先生!我有一种感觉是问题所在,但是通过 scipy 文档挖掘,我找不到使用浮点值实现矩阵的语法。
  • 啊,你是对的......我只是假设它会返回一个 int。
  • @Taj - 那是因为它不是 scipy 的一部分,它是 numpy。查看基本的 numpy 教程:scipy.org/Tentative_NumPy_Tutorial 和用户指南:docs.scipy.org/doc/numpy/user/index.html#user 和 numpy 文档:docs.scipy.org/doc/numpy/reference/index.html#reference
【解决方案2】:

我对科学 python 了解不多,但我知道出了什么问题。似乎矩阵元素表示为 32 位有符号整数。这意味着它们被限制在 -2^31

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

(我也可以建议你试试sage:www.sagemath.org,这是一个基于python的数学软件。它自动使用无限精度。这就是我刚才检查这些数字的方法。

祝你好运!蒂莫

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-07-21
    • 2014-11-29
    • 2014-09-20
    相关资源
    最近更新 更多