Python:用高精度浮点数反矩阵

Python: inverse a matrix with high precision floats

提问人:maciek 提问时间:10/19/2020 更新时间:10/24/2020 访问量:801

问:

我正在阅读有关如何在 Python 中处理多精度算术的教程。
最后,我想要一个具有任意高精度浮点数的数组,我需要反转该矩阵。
numpy

因此,我们有:

import sys
import numpy as np
import gmpy2

print(sys.version)
print(np.__version__)
print(gmpy2.version)
3.6.10 | packaged by conda-forge | (default, Apr 24 2020, 16:27:41) 
[GCC Clang 9.0.1 ]
1.12.1
<built-in function version>

其次是数据生成:

A = np.ones((3,3));
B = A/gmpy2.mpfr("1.0")
print(A)
print(B)
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
[[mpfr('1.0') mpfr('1.0') mpfr('1.0')]
 [mpfr('1.0') mpfr('1.0') mpfr('1.0')]
 [mpfr('1.0') mpfr('1.0') mpfr('1.0')]]

有问题的部分:

print(np.linalg.pinv(B))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-23-3a70ff54e53d> in <module>
----> 1 print(np.linalg.pinv(B))

~/conda-envs/Python_Jupyter/env/lib/python3.6/site-packages/numpy/linalg/linalg.py in pinv(a, rcond)
   1660     _assertNoEmpty2d(a)
   1661     a = a.conjugate()
-> 1662     u, s, vt = svd(a, 0)
   1663     m = u.shape[0]
   1664     n = vt.shape[1]

~/conda-envs/Python_Jupyter/env/lib/python3.6/site-packages/numpy/linalg/linalg.py in svd(a, full_matrices, compute_uv)
   1402 
   1403         signature = 'D->DdD' if isComplexType(t) else 'd->ddd'
-> 1404         u, s, vt = gufunc(a, signature=signature, extobj=extobj)
   1405         u = u.astype(result_t, copy=False)
   1406         s = s.astype(_realType(result_t), copy=False)

TypeError: No loop matching the specified signature and casting
was found for ufunc svd_n_s

有谁知道如何实现我正在努力实现的目标?

python numpy 浮点 精度 gmpy

评论

0赞 hpaulj 10/19/2020
np.linalg可能具有 dtype 的数组有问题,即不是其编译代码中使用的数值类型的元素。 用于其高精度数值工作,但我不知道它对矩阵逆有什么影响。objectsympympmath
0赞 hpaulj 10/19/2020
了解您正在使用的教程以及此特定任务中有多少来自那里可能会有所帮助。他们真的建议使用 ?在奇异数组上?pinv

答:

0赞 maciek 10/24/2020 #1

我已经设法用非常精确的数字反演了一个矩阵,其中包含许多内置的数学函数以及一个矩阵类。感谢您的评论!mpmath