Simpy の紹介: Python シミュレーション ライブラリ-02/5

1. 説明

        Python でのシミュレーション ライブラリに関して、この記事は物理モデルの詳細を説明する第 2 部にあたりますが、この部分の内容は第 1 部のシンボルの導入に強く依存しているため、次の提案が提供されます。

         前編を読んだ場合、この記事は後編となりますこのシリーズの最初の部分をチェックすることをお勧めします。

2. SymPy —簡素化

 

        SymPy は、多様な簡略化機能により数式を簡略化することに優れています。SymPy には、式を最も直接的に表現するために設計された一般的な Simply() 関数があります。

        単純化: sympy.simplify モジュールにある simple() 関数は、ヒューリスティックを使用して入力式の単純さを強化するように設計されています。例では、sin²(x) + cos²(x) という式を簡略化してその使用法を示します。

from sympy import * 
x=Symbol('x')
expr=sin(x)**2 + cos(x)**2 
simplify(expr)
Output:
1

3. 展開する

        Expand() は、SymPy で最も一般的な単純化関数の 1 つで、多項式の展開に使用されます。例えば ​​-

a,b=symbols('a b') 
expand((a+b)**2)

expand((a+b)*(a-b))

        Expand() 関数は通常、式のサイズを増加させますが、適用すると式のサイズが減少する場合もあります。一般に、expand() を呼び出すと式が大きくなる可能性がありますが、式が単純化される例外もあります。

expand((x + 1)*(x - 2) - (x - 1)*x)
Output:
-2

4. 因数分解

        この関数は多項式を受け取り、それを有理数の領域で既約成分に分解します。

x,y,z=symbols('x y z') 
expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
factor(expr)

factor(x**2+2*x+1)

        Factor() 関数は Expand() の逆関数であり、既約因数を保証します。Factor_list() は、因子の構造化された出力を提供します。

expr=(x**2*z + 4*x*y*z + 4*y**2*z) 
factor_list(expr)
Output:
(1, [(z, 1), (x + 2*y, 2)])

5. コレクトコレクト

        この関数は、有理指数を考慮して、式のリストに基づいて式の加法コンポーネントを収集します。

expr=x*y + x - 3 + 2*x**2 - z*x**2 + x**3 
expr

6. キャンセル

        cancel() 関数の目的は、任意の有理関数を一般形式 p/q に変換することです。ここで、p と q は共有因数のない拡張多項式です。さらに、p と q の先頭の係数は整数であり、小数部分がありません。

expr1=x**2+2*x+1 
expr2=x+1 
cancel(expr1/expr2)
Output:
x+1
expr = 1/x + (3*x/2 - 2)/(x - 4) 
expr

cancel(expr)

7. trigsimp (三角恒等式)

        この関数の目的は、三角恒等式を単純化することです。逆三角関数の命名規則では、関数名にプレフィックスとして「a」を追加する必要があることに注意してください。たとえば、アークコサインは「acos()」と表されます。

from sympy import trigsimp, sin, cos 
from sympy.abc import x, y
expr = 2*sin(x)**2 + 2*cos(x)**2 
trigsimp(expr)
Output:
2

        trigsimp 関数は、ヒューリスティックを使用して、最適な三角関数恒等式を適用します。

8. 指数項の簡略化

この関数は、累乗を同様の基数と指数と組み合わせることにより、指定された式を簡素化します。

expr=x**y*x**z*y**z 
expr

powsimp(expr)

        powsimp() の動作方法は 2 つの方法で制御できます。1 つは基数のみを結合する方法、もう 1 つは指数のみを結合する方法です。デフォルトの「all」モードは、基数と指数を組み合わせたものです。「force」を True に設定すると、仮定に関係なくベースがマージされます。

powsimp(expr, combine='base', force=True)

9. コムシンプ

        SymPy の Combsimp() 関数を使用すると、階乗や二項を含む組み合わせ式を簡素化できます。さらに、SymPy は階乗を処理するための専用の Factorial() 関数も提供します。

expr=factorial(x)/factorial(x - 3) 
expr

上記の結合式を簡略化するために、以下に示すように Combsimp() 関数を使用します-

combsimp(expr)

10. 対数結合

この関数は対数を受け取り、次のルールを使用してそれらを組み合わせます-

  • log(x) + log(y) == log(x*y) (両方が正の場合)
  • a*log(x) == log(x**a) x が正で a が実数の場合
logcombine(a*log(x) + log(y) - log(z))

この関数で「force」パラメータが有効になっている場合、数量に関する既存の仮定がない限り、上記の条件が有効であると想定されます。

logcombine(a*log(x) + log(y) - log(z), force=True)

11. SymPy — デリバティブ

        関数の導関数は、その変数の 1 つがどれだけ速く変化するかを示します。これは、特定の点における接線の傾きを決定することに対応します。SymPy では、「diff()」関数を使用して、変数を使用した数式の微分を計算できます。

diff(expr, variable)
from sympy import diff, sin, exp 
from sympy.abc import x,y 
expr=x*sin(x*x)+1 >>> expr

diff(expr,x)

diff(exp(x**2),x)

複数の導関数を計算するには、微分ステップごとに変数を繰り返すか、変数の後に数値を指定して目的の順序を指定するだけです。

diff(x**4,x,3)
Output:
24x
for i in range(1,4): print (diff(x**4,x,i))
Output:
4*x**3
12*x**2
24*x

        式の diff() メソッドを呼び出すこともできます。これは diff() 関数と同様に機能します。

expr=x*sin(x*x)+1 
expr.diff(x)

        SymPy の Derivative クラスを使用すると、diff() 関数と同じ構文を共有して、未評価の導関数を作成できます。この導関数の実際の結果を取得するには、doit メソッドを適用します。

from sympy import Derivative 
d=Derivative(expr) 
d

d.doit()

12. SymPy — 統合

        SymPy パッケージには、数式の定積分および不定積分を計算するために設計された統合モジュールがあります。Integrated() メソッドは、式の後に変数が指定されている場合、原始積分または不定積分を評価できます。

integrate(f, x)

        定積分を計算するには、次のようにパラメータを渡します-

(integration_variable, lower_limit, upper_limit)
from sympy import * 
x,y = symbols('x y') 
expr=x**2 + x + 1 
integrate(expr, x)

expr=sin(x)*tan(x) 
expr 
integrate(expr,x)

expr=exp(-x**2) 
integrate(expr,(x,0,oo) )

        Integral オブジェクトを使用して未計算の積分を作成できます。このオブジェクトは doit() メソッドを呼び出すことで計算できます。

expr = Integral(log(x)**2, x) 
expr

expr.doit()

13. 統合的変革

SymPyは、次のようにさまざまなタイプの積分変換をサポートしています-

  • ラプラス変換
  • フーリエ変換
  • 正弦変換
  • コサイン変換
  • ハンケル変換

前述の関数は sympy.integrals.transforms モジュール内にあります。フーリエ変換とラプラス変換の計算を示す例が提供されています。

例1

from sympy import fourier_transform, exp 
from sympy.abc import x, k 
expr=exp(-x**2) 
fourier_transform(expr, x, k)

Pythonシェルで上記のコマンドを実行すると、次の出力が生成されます-

sqrt(pi)*exp(-pi**2*k**2)

これは - と同等です

例 2

from sympy.integrals import laplace_transform 
from sympy.abc import t, s, a 
laplace_transform(t**a, t, s)

Pythonシェルで上記のコマンドを実行すると、次の出力が生成されます-

(s**(-a)*gamma(a + 1)/s, 0, re(a) > -1)

14. SymPy — マトリックス

        数学における行列は、数値、記号、または数式を含めることができる要素の構造化された配置です。行列演算の概念には、これらの行列構造に対してさまざまな数学的演算を実行することが含まれており、そのすべてが特定の数学的ガイドラインに従っています。

        行列の注目すべき応用例は、線形変換の分野です。これは多くの科学分野、特に行列ベースの方法論が広く使用されている物理分野で重要な概念です。

        SymPy パッケージには、行列を処理するための専用モジュールがあります。このモジュールでは、行列の表現として機能し、行列演算を容易にする基本コンポーネントである Matrix クラスを紹介します。

from sympy.matrices import Matrix
from sympy.matrices import Matrix 
m=Matrix([[1,2,3],[2,3,1]]) 
m

        行列は、適切なサイズのリスト オブジェクトから作成されます。リスト項目を指定した数の行と列に分散して行列を取得することもできます。

M=Matrix(2,3,[10,40,30,2,6,9]) 
M

行列は可変オブジェクトです。行列モジュールは、不変行列を取得するための ImmutableMatrix クラスも提供します。

15. 基本制御

Matrix オブジェクトの Shape プロパティは、そのサイズを返します。

M.shape
Output:
(2,3)

row() メソッドとcol() メソッドは、それぞれ指定された行数または列数を返します。

M.row(0)
Output:
[10 40 30]
M.col(1)

Python のスライス演算子を使用して、行または列に属する 1 つ以上の項目を取得します。

M.row(1)[1:3]

Output:
[6, 9]

Matrixクラスには、指定された行列から指定された行/列を削除するrow_del()およびcol_del()メソッドがあります-

M=Matrix(2,3,[10,40,30,2,6,9]) 
M.col_del(1) 
M

次のコマンドを使用して、出力にスタイルを適用できます-

M.row_del(0) 
M

Output:
[2  6  9]

同様に、 row_insert() メソッドとcol_insert() メソッドは、指定された行または列のインデックスに行または列を追加します。

M1=Matrix([[10,30]]) 
M=M.row_insert(0,M1)
M

16. 算術演算

        加算、減算、乗算を実行するための一般的な演算子 +、-、および * を定義します。

M1=Matrix([[1,2,3],[3,2,1]]) 
M2=Matrix([[4,5,6],[6,5,4]]) 
M1+M2

M1-M2

        最初の行列の列数が 2 番目の行列の行数と一致する場合、行列の乗算を行うことができます。さらに、結果には最初の行列と同じ行数、2 番目の行列と同じ列数が含まれます。

M1=Matrix([[1,2,3],[3,2,1]]) 
M2=Matrix([[4,5],[6,6],[5,4]]) 
M1*M2

17. 行列コンストラクター

        SymPy は、恒等行列やすべてゼロまたは完全に埋められた行列など、さまざまな特殊な行列クラスを提供します。これらのクラスは、それぞれ「eye」、「zeros」、「ones」という名前で表されます。具体的には、単位行列は、対角に沿ったすべての要素が 1 に等しく、他のすべての要素が 0 に設定される正方行列です。

from sympy.matrices import eye
eye(3)

        対角行列では、対角要素は指定されたパラメーターに従って初期化されます。

from sympy.matrices import diag 
diag(1,2,3)

        ゼロ行列のすべての要素は 0 に初期化されます。

from sympy.matrices import zeros 
zeros(2,3)

        同様に、ones はすべての要素が 1 に設定された行列です。

from sympy.matrices import ones
ones(2,3)

        ここまでは順調ですね。このライブラリを使用してさまざまな単純化を見てきましたが、数学ツールボックスは間違いなく優れています。次のセクションでは、本質的にシミュレーションの構成要素を形成する関数を定義して使用する方法を見ていきます。

おすすめ

転載: blog.csdn.net/gongdiwudu/article/details/135450499