72256


以下のコードでは行列計算を行っており、最終的に行列 `X_` の成分を求めています。  
成分はシンボル `t` の関数で、続くコードではその関数のグラフを描き出そうとしています。

しかし、どういうわけか "NameError: name 'Integral' is not defined" というエラーが出てきます。

理由として思い当たるのは `X_`
を表示すればわかる通り、インテグラルが取れていないことです。つまり、sympyなのに数値計算せずに式だけしか返してくれていません。

どうすればプロット出来ますでしょうか？

[code]

    import sympy as sp
    import numpy as np
    import matplotlib.pyplot as plt
    
    A=sp.Matrix([[-2,0],[0,-1]])
    B=sp.Matrix([[1],[1]])
    
    X0=sp.Matrix([[1],[0]])
    
    t=sp.symbols("t")
    T=sp.symbols("T")
    u=1
    
    At=A*t
    
    X=At.exp()*X0
        
    AtT=A*(t-T)
    
    X_=sp.exp(At)*X0+ sp.integrate(sp.exp(AtT).exp()*B*u,(T,0,t))
    
    num_fac_2=len(X_)
    fucs_2=[]
    for i in range(0,num_fac_2):
        fucs_2.append(X_[i])
        sp.plot(X_[i],(t,0,10,0.1))
    
[/code]


CC BY-SA 4.0
2020-11-19T21:51:04.303
72077
2020-11-28T10:01:16.413
2020-11-20T04:10:25.813
3060
41334
question
python python3 sympy
sympyのsympy.plotはプロット出来ない？NameError: name 'Integral' is not defined


次の二つのように方針を決めると、下に示すように書けます。

  * 行列のまま積分するのをあきらめて、要素ごとに積分する。
  * `integrate`で積分を行うのをあきらめて、ただ単に`Integral`で積分を表す。

[code]

    import sympy as sp
    
    A = sp.Matrix([[-2, 0], [0, -1]])
    B = sp.Matrix([[1], [1]])
    X0 = sp.Matrix([[1], [0]])
    
    t, T = sp.symbols("t T")
    u = 1
    
    At = A * t
    AtT = A * (t - T)
    
    constant = At.exp() * X0
    integrand = AtT.exp().exp() * B * u
    
    X0_ = sp.Matrix([[c + sp.Integral(i, (T, 0, t))]
                      for c, i in zip(constant, integrand)])
    
    for x in X0_:
        sp.plot(x, (t, 0, 10, 0.1))
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/j99HX.png)](https://i.stack.imgur.com/j99HX.png)[![画像の説明をここに入力](https://i.stack.imgur.com/6BEuR.png)](https://i.stack.imgur.com/6BEuR.png)


CC BY-SA 4.0
2020-11-28T10:01:16.413
72256
2020-11-28T10:01:16.413
36010
72077
answer