どうも、木村(@kimu3_slime)です。
今回は、Julia(SymPy)で1変数関数を積分する方法を紹介します。数値積分ではなく、数式処理として記号的に積分できます。
準備
SymPyを使うので、持っていなければインストールしておきましょう。
1 2 | using Pkg Pkg.add("SymPy") |
準備として、以下のコードを実行しておきます。
1 | using SymPy |
1変数関数の積分
まず、\(x\)を数式処理用の変数、記号として用意しましょう。
1 | x=symbols("x") |
多項式
2次関数
\[ \begin{aligned}f(x)=3x^2+2x+1\end{aligned} \]
を積分してみます。「数式.integrate(変数)」で積分できます。
1 2 | ex1 = 3*x^2+2*x+1 ex1.integrate(x) |
\[ \begin{aligned}x^{3} + x^{2} + x\end{aligned} \]
不定積分の計算ができていますね。「数式.diff((変数,a,b))」で区間\(a\leq x\leq b\)における定積分が計算できます。
1 | ex1.integrate((x,0,1)) |
\[ \begin{aligned}3\end{aligned} \]
平方根、べき乗関数
同じ方法で積分できるので、どんどん積分していきましょう。
\[ \begin{aligned}\sqrt{x}\end{aligned} \]
1 2 | ex2 = sqrt(x) ex2.integrate(x) |
\[ \begin{aligned}\frac{2 x^{\frac{3}{2}}}{3}\end{aligned} \]
\[ \begin{aligned}x^{\frac{2}{3}}\end{aligned} \]
分数を数式処理的に扱うために、「Rational(分子,分母)」を使います。
1 2 | ex4 = x^(Rational(2,3)) ex4.integrate(x) |
\[ \begin{aligned}\frac{3 x^{\frac{5}{3}}}{5}\end{aligned} \]
負のべき乗、有理関数
負のべき乗も、\(x=0\)で定義されていないことを除いて、きちんと積分してくれます。
1 2 | ex5 = 1/x ex5.integrate(x) |
\[ \begin{aligned}\frac{1}{x}\end{aligned} \]
\[ \begin{aligned}\log{\left(x \right)}\end{aligned} \]
指数が\(-1\)のときだけ、例外的に対数が出てきます。
1 2 | ex3 = 1/x^2 ex3.integrate(x) |
\[ \begin{aligned}\frac{1}{x^{2}}\end{aligned} \]
\[ \begin{aligned}- \frac{1}{x}\end{aligned} \]
有理関数(多項式の分数関数)も、問題なく積分できます。
1 2 | ex6 = (2x+1)/((x-2)*(x-1)*(x+1)) ex6.integrate(x) |
\[ \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} \]
この結果は、部分分数分解
1 | ex6.apart(x) |
\[ \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|\)は、そのままだと積分の形で表示されてしまいます。
1 2 | ex7 = abs(x) ex7.integrate(x) |
\[ \begin{aligned}\int \left|{x}\right|\, dx\end{aligned} \]
不定積分としては、これ以上に表しようがないわけです。積分範囲を具体的に指定すると
1 | ex7.integrate((x,-1,1)) |
\[ \begin{aligned}1\end{aligned} \]
と計算できています。
指数関数、対数関数
オイラー数\(e\)を底とする指数関数は「exp(x)」、(自然)対数関数は「log(x)」です。
1 2 3 4 | ex8 = exp(x) ex8.integrate(x) ex9 = log(x) ex9.integrate(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} \]
底を変えても、きちんと微分は計算されます。
1 2 3 4 | ex10 = 10^x ex10.integrate(x) ex11 = log(10,x) ex11.integrate(x) |
\[ \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}\)を積分してみましょう。
1 2 | ex12 = exp(-x^2) ex12.integrate(x) |
\[ \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\)を表せます。
1 | ex12.integrate((x,0,oo)) |
\[ \begin{aligned}\frac{\sqrt{\pi}}{2}\end{aligned} \]
積分範囲によっては、具体的な値を表示できません。
1 | ex12.integrate((x,0,1)) |
\[ \begin{aligned}\frac{\sqrt{\pi} \operatorname{erf}{\left(1 \right)}}{2}\end{aligned} \]
関数「数式.evalf()」を用いると、数値的に積分の値を求めることができます。
1 | ex12.integrate((x,0,1)).evalf() |
\[ \begin{aligned}0.746824132812427\end{aligned} \]
三角関数、逆三角関数
三角関数、逆三角関数の積分もきちんとできます。
1 2 3 4 5 6 | integrate(sin(x)) integrate(cos(x)) integrate(tan(x)) integrate(asin(x)) integrate(acos(x)) integrate(atan(x)) |
\[ \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} \]
双曲線関数、逆双曲線関数
双曲線関数、逆双曲線関数についても同様です。
1 2 3 4 5 6 | integrate(sinh(x)) integrate(cosh(x)) integrate(tanh(x)) integrate(asinh(x)) integrate(acosh(x)) integrate(atanh(x)) |
\[ \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)でした。ではでは。
コロナ社 (2020-03-26T00:00:01Z)
¥7,353 (コレクター商品)
こちらもおすすめ
Julia(SymPy)で1変数関数を微分する方法(多項式、指数対数、三角関数)
.Julia(SymPy)で有理関数を部分分数分解、通分する方法
Julia(SymPy)で多項式の展開・因数分解、方程式を解く方法
Juliaで1変数関数のグラフを描く方法(多項式、指数対数、三角関数)