うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

(要修復)ToggleButton・RollPolygonWithoutSlipping・貯金時計・直感力トレーニング

関数の定義域内における、最大点・最小点を、「すべて」返すオリジナルツール

はじめに

GeoGebraのコマンド

Max[ <関数>, <xの開始値>, <xの終了値> ]

および

Min[ <関数>, <xの開始値>, <xの終了値> ]

は、関数の最大点*1および最小点*2を、それぞれ「1つだけ」返してくれる。

下図の点Hは、Maxコマンドで描いている。最大点を「1つだけ」返してくれる。しかし、複数ある最大点のうち、どれを返してくれるかは、予測ができない。

f:id:usiblog:20190421221309g:plain

実際には、最大点または最小点が複数ある場合には、それらをすべて返してほしいこともある。

そこで、関数の定義域内における、最大点または最小点を、「すべて」返すオリジナルツールを作成した。

オリジナルツール「AllMax」, 「AllMin」

ggtファイルのダウンロード

AllMax tool - GeoGebra

AllMin tool - GeoGebra

構文

AllMax[ <関数>, <xの開始値>, <xの終了値> ]

AllMin[ <関数>, <xの開始値>, <xの終了値> ]

下図の赤い点は、AllMaxで描いた。青い点は、AllMinで描いた。どちらも、定義域内の最大点・最小点を、もれなく描けている。

f:id:usiblog:20190421222540g:plain

注意

本ツールは、区間[<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) )}]]]]]

 

*1:関数グラフ上の点であって、そのy座標が定義域内における関数の最大値と等しいような点。以下同じ。

*2:関数グラフ上の点であって、そのy座標が定義域内における関数の最小値と等しいような点。以下同じ。