Julia(SymPy)で1変数関数の最大値最小値を求める方法

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

今回は、Julia(SymPy)で1変数関数の最大値最小値を求める方法を紹介します。

 

準備

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

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

 

1変数関数の最大値最小値を求める方法

まず、変数として用いる記号を用意しておきましょう。

 

関数の最大値は、「sympy.maximum(関数,x ,sympy.Interval(範囲))」で求められます。最小値は「minimum」です。

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

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

この結果が正しいことは、そのグラフからも読み取れます。

 

最大値を使って、最大値を取る点(最大点)を求めてみましょう。まず、最大点の方程式は

\[ \begin{aligned}x^{2} – 2 x + 1 = 4\end{aligned} \]

と表せます。これを「solveset(方程式,x, 区間)」で解けば、

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

と、\(x=3\)で最大値\(4\)を取ることがわかります。最小点についても同様です。

\[ \begin{aligned}\left\{2\right\}\end{aligned} \]

 

関数の定義域は有界(有限)とは限らなくても求められます。2つのオー「oo」がSymPyにおいて\(\infty\)を表します。「sympy.Interval(-oo,oo)」が実数全体\(\mathbb{R} = (-\infty ,\infty)\)です。

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

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

 

ただし、プロットの範囲で「oo」を用いるとエラーが出てしまいます。

これを回避するには、範囲指定なしで描けば良いでしょう。

 

以上の結果をまとめて、与えられた範囲における関数の最大点、最大値、最小点、最小値を求め、グラフを描く関数を作ってみましょう。

端点が無限大ooを含むかどうかによって、グラフの描き方を変えています。

 

これを使えば、今までの結果が簡単に得られます。

 

 

3次関数についても、問題なく計算できます。

 

 

指数関数や対数関数でも可能です。

 

対数関数の例では、最大点の計算がうまくできていませんね。

 

有理関数の場合は、計算する範囲によって、うまく求められたり、求められなかったりします。

 

この例では、最大値が存在するのに、最大点が存在しないことになってしまっています。

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

最大値が代数的にきれいに解けず、数値的に求められているので、誤差によって最大点の方程式の解がなくなってしまうのでしょう。

また、範囲によっては時間がかかりすぎて、結果が得られません。

 

特殊関数、例えばガンマ関数の最大値、最小値を求めることもできません。

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

勾配降下法を使えば、極小値を数値的に求めることはできます。

参考:勾配降下法(Python)でガンマ関数の極小値を調べてみよう

 

以上、Julia(SymPy)で1変数関数の最大値最小値を求める方法を紹介してきました。

限界はありますが、ある程度の問題ならば最大点、最小点も合わせて素早く求めてくれるので、便利ですね。

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

 

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

 

こちらもおすすめ

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

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

広義積分とは何か、なぜ学ぶか(ガウス積分とガンマ関数)

勾配降下法(Python)でガンマ関数の極小値を調べてみよう