72515


Jを変数として、以下を変形したいです。ゴールは、分数式ではなく正式になることです。2*(J + 18)+ 2とかになれば成功です。宜しくお願いします。

[code]

    (2 + 2/(J + 18))*(J + 18)
    
[/code]

追記  
すみません、本当は行列の成分で分配を行いたいのです。コードは以下です。最終的には、行列の成分を正式だけにしたいのです。

[code]

    B=sp.Matrix([[0],[0],[-e*(M*r*H/(z*(M*H**2+J)))],[e/z]])
        
    P=sp.Matrix.eye(4)   
    R = sp.Matrix([[3]])
    K= sp.Matrix([[5,3,2,1]])
            
    inv_R=R.inv()
    tB=B.transpose()
        
     print(K-inv_R@tB@P)
     print("\n")
     print((K-inv_R@tB@P)*((J + 18))
    
[/code]

参考までに、数値はこう定義します。

[code]

    M=2 
    r=1 
    H=3 
    J=sp.symbols("J") 
    
    z=1 
    e=1 
    
[/code]


CC BY-SA 4.0
2020-12-08T22:11:34.547
72507
2020-12-31T05:19:39.607
2020-12-31T05:19:39.607
3060
41334
question
python3 sympy
sympyで、分配して約分する方法を教えてください


ダミー変数(`_o`)を用意して、`J+18` と入れ替えてから `simplify` します。元に戻す際には
[sympy.core.expr.UnevaluatedExpr()](https://docs.sympy.org/latest/modules/core.html?highlight=unevaluatedexpr#sympy.core.expr.UnevaluatedExpr)
を使って `J+18` が評価されない様にしています。

[code]

    x, _o = sp.symbols("x o") 
    x = J + 18
    print(
      ((K-inv_R@tB@P)*x)
      .applyfunc(
        lambda f: f.subs(x, _o).simplify().subs(_o, sp.UnevaluatedExpr(x))))
    
    =>
    Matrix([[5*J + 90, 3*J + 54, 2 + 2*(J + 18), 0.666666666666667*J + 12.0]])
    
[/code]


CC BY-SA 4.0
2020-12-09T03:52:03.467
72515
2020-12-09T03:52:03.467
72507
answer