Julia(SymPy)で1変数関数を積分する方法(多項式、指数対数、三角関数)

どうも、木村(@kimu3_slime)です。

今回は、Julia(SymPy)で1変数関数を積分する方法を紹介します。数値積分ではなく、数式処理として記号的に積分できます。

 



準備

SymPyを使うので、持っていなければインストールしておきましょう。

準備として、以下のコードを実行しておきます。

 

1変数関数の積分

まず、\(x\)を数式処理用の変数、記号として用意しましょう。

 

多項式

2次関数

\[ \begin{aligned}f(x)=3x^2+2x+1\end{aligned} \]

を積分してみます。「数式.integrate(変数)」で積分できます。

\[ \begin{aligned}x^{3} + x^{2} + x\end{aligned} \]

不定積分の計算ができていますね。「数式.diff((変数,a,b))」で区間\(a\leq x\leq b\)における定積分が計算できます。

\[ \begin{aligned}3\end{aligned} \]

 

平方根、べき乗関数

同じ方法で積分できるので、どんどん積分していきましょう。

\[ \begin{aligned}\sqrt{x}\end{aligned} \]

\[ \begin{aligned}\frac{2 x^{\frac{3}{2}}}{3}\end{aligned} \]

 

\[ \begin{aligned}x^{\frac{2}{3}}\end{aligned} \]

分数を数式処理的に扱うために、「Rational(分子,分母)」を使います。

\[ \begin{aligned}\frac{3 x^{\frac{5}{3}}}{5}\end{aligned} \]

 

負のべき乗、有理関数

負のべき乗も、\(x=0\)で定義されていないことを除いて、きちんと積分してくれます。

\[ \begin{aligned}\frac{1}{x}\end{aligned} \]

\[ \begin{aligned}\log{\left(x \right)}\end{aligned} \]

指数が\(-1\)のときだけ、例外的に対数が出てきます。

 

\[ \begin{aligned}\frac{1}{x^{2}}\end{aligned} \]

\[ \begin{aligned}- \frac{1}{x}\end{aligned} \]

 

有理関数(多項式の分数関数)も、問題なく積分できます。

\[ \begin{aligned}\frac{2 x + 1}{\left(x – 2\right) \left(x – 1\right) \left(x + 1\right)}\end{aligned} \]

\[ \begin{aligned}\frac{5 \log{\left(x – 2 \right)}}{3} – \frac{3 \log{\left(x – 1 \right)}}{2} – \frac{\log{\left(x + 1 \right)}}{6}\end{aligned} \]

この結果は、部分分数分解

\[ \begin{aligned}- \frac{1}{6 \left(x + 1\right)} – \frac{3}{2 \left(x – 1\right)} + \frac{5}{3 \left(x – 2\right)}\end{aligned} \]

と合わせると、正しいことがわかりやすいです。

 

絶対値

絶対値関数\(|x|\)は、そのままだと積分の形で表示されてしまいます。

\[ \begin{aligned}\int \left|{x}\right|\, dx\end{aligned} \]

不定積分としては、これ以上に表しようがないわけです。積分範囲を具体的に指定すると

\[ \begin{aligned}1\end{aligned} \]

と計算できています。

 

指数関数、対数関数

オイラー数\(e\)を底とする指数関数は「exp(x)」、(自然)対数関数は「log(x)」です。

\[ \begin{aligned}e^{x}\end{aligned} \]

\[ \begin{aligned}e^{x}\end{aligned} \]

\[ \begin{aligned}\log{\left(x \right)}\end{aligned} \]

\[ \begin{aligned}x \log{\left(x \right)} – x\end{aligned} \]

 

底を変えても、きちんと微分は計算されます。

\[ \begin{aligned}10^{x}\end{aligned} \]

\[ \begin{aligned}\frac{10^{x}}{\log{\left(10 \right)}}\end{aligned} \]

\[ \begin{aligned}\frac{\log{\left(x \right)}}{\log{\left(10 \right)}}\end{aligned} \]

\[ \begin{aligned}\frac{x \log{\left(x \right)}}{\log{\left(10 \right)}} – \frac{x}{\log{\left(10 \right)}}\end{aligned} \]

何も底が書かれていない\(\log\)は、ここでは\(\log_e\)であることに注意しましょう。

参考:指数関数の微分の公式の覚え方、導出:指数関数の定義

 

ガウス関数\(e^{-x^2}\)を積分してみましょう。

\[ \begin{aligned}\frac{\sqrt{\pi} \operatorname{erf}{\left(x \right)}}{2}\end{aligned} \]

誤差関数は、\(\operatorname{erf}{\left(x \right)} = \frac{2}{\sqrt{\pi}}\int _0 ^x e^{-t^2}dt\)のことであり、何も計算していないのと同じです。この原始関数は、初等関数で表せないことが知られています。

積分範囲を\((0,\infty)\)とした広義積分(ガウス積分)を求めてみましょう。SymPyでは、オー2つ「oo」で\(\infty\)を表せます。

\[ \begin{aligned}\frac{\sqrt{\pi}}{2}\end{aligned} \]

積分範囲によっては、具体的な値を表示できません。

\[ \begin{aligned}\frac{\sqrt{\pi} \operatorname{erf}{\left(1 \right)}}{2}\end{aligned} \]

関数「数式.evalf()」を用いると、数値的に積分の値を求めることができます。

\[ \begin{aligned}0.746824132812427\end{aligned} \]

 

三角関数、逆三角関数

三角関数、逆三角関数の積分もきちんとできます。

\[ \begin{aligned}- \cos{\left(x \right)}\end{aligned} \]

\[ \begin{aligned}\sin{\left(x \right)}\end{aligned} \]

\[ \begin{aligned}- \log{\left(\cos{\left(x \right)} \right)}\end{aligned} \]

\[ \begin{aligned}x \operatorname{asin}{\left(x \right)} + \sqrt{1 – x^{2}}\end{aligned} \]

\[ \begin{aligned}x \operatorname{acos}{\left(x \right)} – \sqrt{1 – x^{2}}\end{aligned} \]

\[ \begin{aligned}x \operatorname{atan}{\left(x \right)} – \frac{\log{\left(x^{2} + 1 \right)}}{2}\end{aligned} \]

 

双曲線関数、逆双曲線関数

双曲線関数、逆双曲線関数についても同様です。

\[ \begin{aligned}\cosh{\left(x \right)}\end{aligned} \]

\[ \begin{aligned}\sinh{\left(x \right)}\end{aligned} \]

\[ \begin{aligned}x – \log{\left(\tanh{\left(x \right)} + 1 \right)}\end{aligned} \]

\[ \begin{aligned}x \operatorname{asinh}{\left(x \right)} – \sqrt{x^{2} + 1}\end{aligned} \]

\[ \begin{aligned}x \operatorname{acosh}{\left(x \right)} – \sqrt{x^{2} – 1}\end{aligned} \]

\[ \begin{aligned}x \operatorname{atanh}{\left(x \right)} + \log{\left(x + 1 \right)} – \operatorname{atanh}{\left(x \right)}\end{aligned} \]

 

以上、Julia(SymPy)で1変数関数を積分する方法を紹介してきました。

数値計算ではなく記号的に積分してくれるので、関数電卓の代わりに気楽に使えて便利ですね。記号的にうまくいかない場合でも、数値的に求められるのが嬉しいです。

木村すらいむ(@kimu3_slime)でした。ではでは。

 

1から始める Juliaプログラミング
進藤 裕之(著), 佐藤 建太(著)
コロナ社 (2020-03-26T00:00:01Z)
5つ星のうち4.5
¥7,353 (コレクター商品)

 

こちらもおすすめ

Julia(SymPy)で1変数関数を微分する方法(多項式、指数対数、三角関数)  

.Julia(SymPy)で有理関数を部分分数分解、通分する方法

Julia(SymPy)で多項式の展開・因数分解、方程式を解く方法

Juliaで1変数関数のグラフを描く方法(多項式、指数対数、三角関数)