Невозможно создать mpf из комплексного числа при вызове qr_solve

Я делаю следующий импорт:

from sympy.matrices import Matrix as sy_matrix
import sympy.mpmath as sy_mp

Создайте мои матрицы, как это:

sysMat = sy_matrix([[0.0]*sz1]*sz2)       
resVec = sy_matrix([[0.0]]*sz2)

Заполните затем комплексными числами Python (например, 1.0+1.0j) и затем вызовите:

coeffVec = sy_mp.qr_solve(sysMat, resVec)

Однако я получаю следующее исключение:

  File "..\RatSMat.py", line 69, in solve
    self.coeffVec = sy_mp.qr_solve(self.sysMat, self.resVec)
  File "C:\Python27\lib\site-packages\sympy\mpmath\matrices\linalg.py", line 406, in qr_solve
    A, b = ctx.matrix(A, **kwargs).copy(), ctx.matrix(b, **kwargs).copy()
  File "C:\Python27\lib\site-packages\sympy\mpmath\matrices\matrices.py", line 328, in __init__
    A = self.ctx.matrix(args[0].tolist())
  File "C:\Python27\lib\site-packages\sympy\mpmath\matrices\matrices.py", line 301, in __init__
    self[i, j] = convert(a)
  File "C:\Python27\lib\site-packages\sympy\mpmath\ctx_mp_python.py", line 662, in convert
    return ctx._convert_fallback(x, strings)
  File "C:\Python27\lib\site-packages\sympy\mpmath\ctx_mp.py", line 614, in _convert_fallback
    raise TypeError("cannot create mpf from " + repr(x))
  TypeError: cannot create mpf from -2.27448396079674e-13*I

Кажется, это происходит, когда sympy устанавливает матрицы перед вводом, что мне кажется странным, поскольку я указываю комплексный тип sympy. Думаю, я где-то использую неправильные матрицы или тип ввода.

1 ответ

Решение

Проблема в том, что mpmath не знает, как конвертировать объект Sympy I (мнимая единица) в свой объект для представления комплексных чисел. Может работать с Python jВпрочем, как видно из источника.

Следует отметить, что mpmath, библиотека для высокоточных вычислений с плавающей запятой, не зависит от Sympy, библиотеки для символьных вычислений. Нет необходимости определять объекты Sympy, а затем просить mpmath работать с ними. Просто используйте mpmath напрямую.

import mpmath
mpmath.mp.dps = 50    # 50 digit arithmetic, for demonstration
A = mpmath.matrix([[2+3j, 1], [1, 1]])
b = mpmath.matrix([[1], [1]])
mpmath.qr_solve(A, b)

Выход:

(matrix(
[[mpc(real='3.436455137311543569947658013827436034380299778494123e-55', imag='-1.2867118438861911327915233933248665673255859691704302e-55')],
 [mpc(real='1.0', imag='-1.1953121943036561823547019562093175737721941131313411e-54')]]), mpf('1.7055229691470039210052256620915903242996742650953353e-54'))
Другие вопросы по тегам