関数の定義域内における、最大点・最小点を、「すべて」返すオリジナルツール
はじめに
GeoGebraのコマンド
Max[ <関数>, <xの開始値>, <xの終了値> ]
および
Min[ <関数>, <xの開始値>, <xの終了値> ]
は、関数の最大点*1および最小点*2を、それぞれ「1つだけ」返してくれる。
下図の点Hは、Maxコマンドで描いている。最大点を「1つだけ」返してくれる。しかし、複数ある最大点のうち、どれを返してくれるかは、予測ができない。
実際には、最大点または最小点が複数ある場合には、それらをすべて返してほしいこともある。
そこで、関数の定義域内における、最大点または最小点を、「すべて」返すオリジナルツールを作成した。
オリジナルツール「AllMax」, 「AllMin」
ggtファイルのダウンロード
構文
AllMax[ <関数>, <xの開始値>, <xの終了値> ]
AllMin[ <関数>, <xの開始値>, <xの終了値> ]
下図の赤い点は、AllMaxで描いた。青い点は、AllMinで描いた。どちらも、定義域内の最大点・最小点を、もれなく描けている。
注意
本ツールは、区間[<xの開始値>, <xの終了値>]内で連続である関数を前提に設計しています。
関数が、区間[<xの開始値>, <xの終了値>]内で連続でない場合には、正しい結果を返しません。例えば、AllMax[1/x, -1, 1]は、最大値・最小値ともに「なし」としたいところですが、仕様上、そのようには動きません。
(参考)AllMax, AllMinツールの内部構造
AllMax[f, a, b]およびAllMin[f, a, b]の内部構造を紹介する。
AllMax(AllMin)ツールは、以下の順序でオブジェクトを作成していく。
引数:関数オブジェクトf, 数値オブジェクトa,b
↓
途中経過:originalList→sortedPointList→yList→areMax(areMin)
↓
戻り値:maxList(minList)
以下では、各オブジェクトの定義を、順に紹介する。
originalList
極大点、極小点、区間の両端の点をすべて集めて、リストを作成する。
originalList = RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}]
sortedPointList
originalListを、x座標の昇順で並び替える
sortedPointList = Sort[originalList, Zip[x(λ), λ, originalList]]
yList
sortedPointListのy座標だけを取り出して、リストにする
yList = Zip[y(η), η, sortedPointList]
areMax
yListの各要素に対して、yListの最大値と等しいならtrue, 異なる(すなわち最大値ではない)ならfalseを返し、結果をリストにする
areMax = Zip[ε ≟ Max[yList], ε, yList]
areMin
yListの各要素に対して、yListの最小値と等しいならtrue, 異なる(すなわち最小値ではない)ならfalseを返し、結果をリストにする
Zip[ζ ≟ Min[yList], ζ, yList]
maxList, minList
areMaxのある要素がtrueなら、sortedPointListの対応する要素(点)を返す。falseなら、いったん?を返し、RemoveUndefinedで?を削除する。これによって、最大点のみを抽出する。minListも同様。これらが、AllMax[f, a, b], AllMin[f, a, b]の戻り値と一致する。
maxList = RemoveUndefined[Zip[If[α, β, ?], α, areMax, β, sortedPointList]]
minList = RemoveUndefined[Zip[If[γ, δ, ?], γ, areMin, δ, sortedPointList]]
AllMax, AllMinの定義
maxList, minListの定義を、f, a, bだけで表した(ネストした)ものが、AllMax, AllMinの定義である。
AllMax[f, a, b] = RemoveUndefined[Zip[If[α, β, ?], α, Zip[ε ≟ Max[Zip[y(η), η, Sort[RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}], Zip[x(λ), λ, RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}]]]]], ε, Zip[y(η), η, Sort[RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}], Zip[x(λ), λ, RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}]]]]], β, Sort[RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}], Zip[x(λ), λ, RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}]]]]]
AllMin[f, a, b] = RemoveUndefined[Zip[If[γ, δ, ?], γ, Zip[ζ ≟ Min[Zip[y(η), η, Sort[RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}], Zip[x(λ), λ, RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}]]]]], ζ, Zip[y(η), η, Sort[RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}], Zip[x(λ), λ, RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}]]]]], δ, Sort[RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}], Zip[x(λ), λ, RemoveUndefined[{Extremum[f, a, b], ( a, f(a) ), ( b, f(b) )}]]]]]