python - 使用 Python 计算 P**n 而 n 接近 +oo 并且 P 是矩阵

标签 python sympy

代码是

import sympy as sm
import numpy as np

k=sm.Symbol('k')
p=np.matrix([[1./2,1./4,1./4],[1./2,0,1./2],[1./4,0,3./4]])
sm.limit(p**k,k,sm.oo)

它表示“类型错误:指数必须是整数”。但是,如果我将矩阵更改为这样的常数 sm.limit(2**k,k,sm.oo) , 它可以打印出正确的答案。那么我该如何处理这个问题呢?感谢您的帮助!

最佳答案

使用 SymPy 矩阵:

In [5]: p = sm.Matrix(p)

然后符号的指数将起作用:

In [6]: p**k
Out[6]: 
⎡                                     k                                      k                        k                                          k                                     
⎢ 0.216542364659101⋅-0.154508497187474  + 0.419821271704536⋅0.404508497187474  + 0.363636363636364⋅1.0     - 0.350372906022699⋅-0.154508497187474  + 0.259463815113608⋅0.40450849718747
⎢                                                                                                                                                                                      
⎢                                      k                                      k                        k                                       k                                       
⎢- 0.507064433090879⋅-0.154508497187474  + 0.143428069454515⋅0.404508497187474  + 0.363636363636364⋅1.0    0.820447487227238⋅-0.154508497187474  + 0.0886434218636708⋅0.404508497187474
⎢                                                                                                                                                                                      
⎢                                       k                                      k                        k                                        k                                     
⎣- 0.0598508375909206⋅-0.154508497187474  - 0.303785526045443⋅0.404508497187474  + 0.363636363636364⋅1.0    0.0968406894772593⋅-0.154508497187474  - 0.18774978038635⋅0.404508497187474

 k                         k                                       k                                      k                        k  ⎤
4  + 0.0909090909090909⋅1.0    0.133830541363598⋅-0.154508497187474  - 0.679285086818143⋅0.404508497187474  + 0.545454545454545⋅1.0   ⎥
                                                                                                                                      ⎥
k                         k                                         k                                      k                        k ⎥
  + 0.0909090909090909⋅1.0     - 0.31338305413636⋅-0.154508497187474  - 0.232071491318186⋅0.404508497187474  + 0.545454545454545⋅1.0  ⎥
                                                                                                                                      ⎥
k                         k                                          k                                      k                        k⎥
  + 0.0909090909090909⋅1.0    - 0.0369898518863388⋅-0.154508497187474  + 0.491535306431793⋅0.404508497187474  + 0.545454545454545⋅1.0 ⎦

此时您可以将限制应用于单个组件:

In [9]: (p**k).applyfunc(lambda x: limit(x, k, sm.oo))
Out[9]: 
⎡∞  ∞  ∞⎤
⎢       ⎥
⎢∞  ∞  ∞⎥
⎢       ⎥
⎣∞  ∞  ∞⎦

这可能是浮点近似错误或错误。尝试另一种方式:

In [15]: p**10000000000000
Out[15]: 
⎡0.363636363636364  0.0909090909090909  0.545454545454545⎤
⎢                                                        ⎥
⎢0.363636363636364  0.0909090909090909  0.545454545454545⎥
⎢                                                        ⎥
⎣0.363636363636364  0.0909090909090909  0.545454545454546⎦

我强烈建议避免使用 float 进行此类操作,最好定义一个 SymPy 数字矩阵:

In [19]: p = Matrix([[sm.S.One/2, sm.S.One/4, sm.S.One/4], [sm.S.One/2, 0, sm.S.One/2], [sm.S.One/4, 0, sm.S.One*3/4]])

In [20]: p
Out[20]: 
⎡1/2  1/4  1/4⎤
⎢             ⎥
⎢1/2   0   1/2⎥
⎢             ⎥
⎣1/4   0   3/4⎦

现在,如果您尝试simplify(pk)**,您将获得矩阵幂的封闭表达式:

In [27]: simplify(p**k)
Out[27]: 
⎡  -k ⎛      6⋅k           6⋅k       3⋅k         k       3⋅k            k        3⋅k          k       3⋅k             k         k           k⎞    -k ⎛      6⋅k          6⋅k       3⋅k 
⎢64  ⋅⎝- 36⋅2   ⋅√5 + 120⋅2    - 55⋅2   ⋅(1 + √5)  + 33⋅2   ⋅√5⋅(1 + √5)  - 120⋅2   ⋅(-√5 + 1)  + 58⋅2   ⋅√5⋅(-√5 + 1)  - 220⋅64  + 88⋅√5⋅64 ⎠  64  ⋅⎝- 42⋅2   ⋅√5 + 30⋅2    - 44⋅2   ⋅
⎢─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────  ───────────────────────────────────────
⎢                                                               11⋅(-25 + 13⋅√5)                                                                                                       
⎢                                                                                                                                                                                      
⎢        ⎛                                                           3⋅k          k          3⋅k             k            k               k⎞                                           
⎢     -k ⎜         3⋅k            k          3⋅k         k   161301⋅2   ⋅(-√5 + 1)    72136⋅2   ⋅√5⋅(-√5 + 1)    408950⋅64    182888⋅√5⋅64 ⎟                                           
⎢ 2⋅64  ⋅⎜- 23184⋅2   ⋅√5⋅(1 + √5)  + 51841⋅2   ⋅(1 + √5)  - ────────────────────── + ──────────────────────── - ────────── + ─────────────⎟      -k ⎛      6⋅k          6⋅k        3⋅k
⎢        ⎝                                                             11                        11                  11             11     ⎠    64  ⋅⎝- 42⋅2   ⋅√5 + 30⋅2    - 242⋅2   
⎢ ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────    ───────────────────────────────────────
⎢                                                             -204475 + 91444⋅√5                                                                                                       
⎢                                                                                                                                                                                      
⎢                         ⎛       6⋅k       6⋅k                                                      k                 k⎞                                                              
⎢                      -k ⎜  100⋅2      52⋅2   ⋅√5                k             k   41⋅√5⋅(-8⋅√5 + 8)    89⋅(-8⋅√5 + 8) ⎟                                                              
⎢                    64  ⋅⎜- ──────── + ────────── - √5⋅(8 + 8⋅√5)  + (8 + 8⋅√5)  - ────────────────── + ───────────────⎟                          -k ⎛      6⋅k          6⋅k       3⋅k
⎢                         ⎝     11          11                                              11                  11      ⎠                       -64  ⋅⎝- 42⋅2   ⋅√5 + 30⋅2    - 33⋅2   
⎢                    ────────────────────────────────────────────────────────────────────────────────────────────────────                       ───────────────────────────────────────
⎣                                                                -25 + 13⋅√5                                                                                                           

           k        3⋅k         k       3⋅k          k       3⋅k             k        k           k⎞     -k ⎛     3⋅k            k      3⋅k         k      3⋅k          k      3⋅k     
√5⋅(1 + √5)  + 110⋅2   ⋅(1 + √5)  - 85⋅2   ⋅(-√5 + 1)  + 31⋅2   ⋅√5⋅(-√5 + 1)  - 55⋅64  + 55⋅√5⋅64 ⎠   64  ⋅⎝- 2⋅2   ⋅√5⋅(1 + √5)  - 3⋅2   ⋅(1 + √5)  - 3⋅2   ⋅(-√5 + 1)  + 2⋅2   ⋅√5⋅(
────────────────────────────────────────────────────────────────────────────────────────────────────   ────────────────────────────────────────────────────────────────────────────────
                       11⋅(-25 + 13⋅√5)                                                                                                                11                              



         k        3⋅k            k      3⋅k          k       3⋅k             k        k           k⎞            -k ⎛    6⋅k                k                k                 k        
⋅(1 + √5)  + 110⋅2   ⋅√5⋅(1 + √5)  - 8⋅2   ⋅(-√5 + 1)  + 20⋅2   ⋅√5⋅(-√5 + 1)  - 55⋅64  + 55⋅√5⋅64 ⎠          64  ⋅⎝30⋅2    - 15⋅(8 + 8⋅√5)  + √5⋅(8 + 8⋅√5)  - 15⋅(-8⋅√5 + 8)  - √5⋅(-
────────────────────────────────────────────────────────────────────────────────────────────────────          ─────────────────────────────────────────────────────────────────────────
                       11⋅(-25 + 13⋅√5)                                                                                                                55                              



         k       3⋅k            k       3⋅k             k       3⋅k          k        k           k⎞       -6⋅k ⎛    6⋅k                k                   k                    k     
⋅(1 + √5)  + 11⋅2   ⋅√5⋅(1 + √5)  - 24⋅2   ⋅√5⋅(-√5 + 1)  + 58⋅2   ⋅(-√5 + 1)  - 55⋅64  + 55⋅√5⋅64 ⎠      2    ⋅⎝60⋅2    + 25⋅(8 + 8⋅√5)  + 13⋅√5⋅(8 + 8⋅√5)  - 13⋅√5⋅(-8⋅√5 + 8)  + 25
─────────────────────────────────────────────────────────────────────────────────────────────────────     ─────────────────────────────────────────────────────────────────────────────
                       11⋅(-13⋅√5 + 25)                                                                                                               110                              

        k       k⎞⎤
-√5 + 1)  + 6⋅64 ⎠⎥
──────────────────⎥
                  ⎥
                  ⎥
                  ⎥
                  ⎥
         k⎞       ⎥
8⋅√5 + 8) ⎠       ⎥
───────────       ⎥
                  ⎥
                  ⎥
                  ⎥
                  ⎥
            k⎞    ⎥
⋅(-8⋅√5 + 8) ⎠    ⎥
──────────────    ⎥
                  ⎦

不幸的是,SymPy 中有一些错误不允许计算此限制。不知道这个表达式是否对你有用。

关于python - 使用 Python 计算 P**n 而 n 接近 +oo 并且 P 是矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39736887/

相关文章:

Python Google Sheets API 循环限制 429 错误

python - PyQT4改变qDateTimeEdit时间值?

python - Sympy - 改变绘图的 y 轴范围

Python- Sympy 问题,当 evaluate=False 时进行表达式相等性检查

python - 复数点积

sympy - 如何为多个变量声明具有多个限制的 sympy Piecewise

python - 如何将ITEM与数据库中的记录进行匹配?

python - 如何在 Pyplot 中获得平滑的平均曲线

python - SymPy:如何使 `nsolve` 返回包含找到的解决方案的字典

python - PyPDF2 问题和从 S3 解码 pdf 文件