首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在出现问题时执行mpmath.sqrtm()

不能在出现问题时执行mpmath.sqrtm()
EN

Stack Overflow用户
提问于 2014-11-25 03:04:11
回答 2查看 290关注 0票数 0

我有下面的代码来提取对称二阶张量的平方根。

代码语言:javascript
复制
from sympy import symbols, Matrix, mpmath
import numpy as np

F11, F12, F13, F21, F22, F23, F31, F32, F33 = symbols('F11, F12, F13, F21, F22, F23, F31, F32, F33', real=True)
F = np.array([[F11, F12, F13], [F21, F22, F23], [F31, F32, F33]])
B = F.dot(F.T)
mpmath.sqrtm(Matrix(B))

然而,它给了我一个错误:

代码语言:javascript
复制
TypeError                                 Traceback (most recent call last)
<ipython-input-14-439fed475a57> in <module>()
      5 F = np.array([[F11, F12, F13], [F21, F22, F23], [F31, F32, F33]])
      6 B = F.dot(F.T)
----> 7 mpmath.sqrtm(Matrix(B))

X:\WinPython3\python-3.4.2.amd64\lib\site-packages\sympy\mpmath\matrices\calculus.py in sqrtm(ctx, A, _may_rotate)
    308 
    309         """
--> 310         A = ctx.matrix(A)
    311         # Trivial
    312         if A*0 == A:

X:\WinPython3\python-3.4.2.amd64\lib\site-packages\sympy\mpmath\matrices\matrices.py in __init__(self, *args, **kwargs)
    326                     A[i,j] = convert(A[i,j])
    327         elif hasattr(args[0], 'tolist'):
--> 328             A = self.ctx.matrix(args[0].tolist())
    329             self.__data = A._matrix__data
    330             self.__rows = A._matrix__rows

X:\WinPython3\python-3.4.2.amd64\lib\site-packages\sympy\mpmath\matrices\matrices.py in __init__(self, *args, **kwargs)
    299                 for i, row in enumerate(A):
    300                     for j, a in enumerate(row):
--> 301                         self[i, j] = convert(a)
    302             else:
    303                 # interpret list as row vector

X:\WinPython3\python-3.4.2.amd64\lib\site-packages\sympy\mpmath\ctx_mp_python.py in convert(ctx, x, strings)
    660         if hasattr(x, '_mpmath_'):
    661             return ctx.convert(x._mpmath_(prec, rounding))
--> 662         return ctx._convert_fallback(x, strings)
    663 
    664     def isnan(ctx, x):

X:\WinPython3\python-3.4.2.amd64\lib\site-packages\sympy\mpmath\ctx_mp.py in _convert_fallback(ctx, x, strings)
    612             else:
    613                 raise ValueError("can only create mpf from zero-width interval")
--> 614         raise TypeError("cannot create mpf from " + repr(x))
    615 
    616     def mpmathify(ctx, *args, **kwargs):

TypeError: cannot create mpf from F11**2 + F12**2 + F13**2

我可以问一下为什么会发生这种情况吗?这是sympy的局限性,还是我做错了什么?

谢谢!

肖恩

EN

回答 2

Stack Overflow用户

发布于 2014-11-25 03:34:29

mpmath.sqrtm需要一个由数字组成的方阵;如果您想以符号方式获取B中每个元素的sqrt,请尝试:

代码语言:javascript
复制
>>> B.applyfunc(sqrt)
票数 1
EN

Stack Overflow用户

发布于 2014-11-25 07:52:49

不要使用NumPy进行符号计算。NumPy仅适用于数值数组。

要取矩阵的平方根,请使用B**(Rational(1, 2)) (sqrt(B)也应该有效,但看起来默认情况下它仍未求值)。

然而,在这种情况下,SymPy挂起了,因为它通过对角化来计算平方根,并且特征值不会简化(或者至少SymPy不知道如何简化它们),所以它们是巨大的三次方程。看看B.eigenvals()吧。因此,这个矩阵的平方根非常大。您期望平方根矩阵是一个相对简单的表达式吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27112243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档