複天一流:どんな手を使ってでも問題解決を図るブログ

宮本武蔵の五輪書の教えに従い、どんな手を使ってでも問題解決を図るブログです(特に、科学、数学、工学の問題についてですが)

失われた対数の性質 (part 4):最後の山場

前回のあらすじ

対数関数にパラメーターを入れる二つの方法(割り算系と足し算系)を吟味した。 関連する性質についてのこれまでの考察に基づき、いよいよ最後の問題に対処しようと思う。

私の間違いは最後の最後の設問で発生し、それは自然対数に慣れ親しみすぎた結果であると 反省したのである。その反省を元に、すべて対数問題は自然対数に帰着させることで 解決可能であるとの結論に達した。その視点を今回応用し「対数関数マスター」の称号を 得んとするものである。

$f(x,y)=\log_x y$という「二次元」の問題

これまでの問題では、底の部分を「パラメータ」扱いしていたが、ここでは「変数」に変えてみようというのが、 最後の問題の趣旨である。いうなれば、$(x,y)$の二変数関数$f(x,y)$を考えてみようという提案である。

高校では多変数関数は扱わず、偏微分もやらないから、本来はこの問題は「アウト」である。しかし、 条件を与えて、問題を1次元の問題に「投影」している点が「賢い」点である。高校生の不満はあるだろうが、 今回はこの部分でもっとも勉強させてもらったので、まずはこのアプローチを受け入れることから始めよう。

対数関数の基本性質を反映し、$x>0, y>0$がまずは仮定されている。また自明な問題になるのをさけるため、 $x\ne 1$も条件で与えられた。もし$x=1$だとすると、 \begin{equation} f(x,y)=\log_1 y \leftrightarrow 1^f = y \leftrightarrow y=1 \end{equation} となって「つまらない」問題になってしまう。

(i)では、$\log_x y=2$という条件が与えられ、この多次元問題の「断面」の性質について調べることが要求されている。これは「対数関数は指数関数に戻してから考える」の基本に戻れば怖い問題ではない。ということで省略する。

問題は(ii)である。与えられた条件式は「不等式」である。両端の条件が与えられているので実質は二つの条件とみなすことができる。

\begin{equation} 0 < \log_x y < 1 \end{equation}

まずは私の「失敗」から披露しよう。まず、定数部分を対数の表現に書き換える。 \begin{equation} \log_x 1 < \log_x y < \log_x x \end{equation} ここまでは正しい。次の認識が間違いである。わたしは「対数関数は単調増加関数なので」と決めつけて、 \begin{equation} 1 < y < x \end{equation} と考えてしまったのである。このやり方だと、答えは(0)となるが、もちろん「間違い」である。この答えに似ているグラフがないか、見渡すと(2)と(4)である。さて、どれが正解なのであろうか?

ここまでの考察で「対数関数は単調増加」という認識が間違いである一方で、 「自然対数関数が単調増加」という認識は正しいことを確認した。そこで、不等式全体を自然対数に書き換えてみることにする。

\begin{equation} 0 < \frac{\log y}{\log x} < 1 \end{equation} つまり、この不等式は2つの自然対数関数の「比」になっていることがよくわかる。x,yはもともとは当然独立なのだが、 条件式によってリンクさせられている。よりわかりやすい条件式に書き換えるために、比の形を解消したいところだが、 不等式は両辺にかける数が正か負によって不等号の向きが変わったり変わらなかったりするか気をつけねばならない。

まずは$\log x > 0$の場合、つまり$x>1$の場合を考えよう。これは「間違えたやり方」で得た結論$1<y<x$にたどり着く。 なぜなら自然対数関数は「単調増加」であるからである。

次は$\log x < 0$の場合、つまり$0<x<1$の場合を考える。ここが大切である。なぜなら、上の「間違えたやり方」では この部分の議論が欠落していたからである。負の数を両辺にかけるので、不等式の向きは「裏返る」。つまり、 \begin{equation} 0 > \log y > \log x \end{equation} したがって、 \begin{equation} 1 > y > x \end{equation} を得る。これは試験問題では(2)のグラフである。

わかったこと

私たちは自然対数、そして常用対数にあまりにも慣れ親しみすぎて、対数関数が「単調増加」であると決めてかかる癖がある。 そのため、底$a$が1より小さい場合、$y=\log_a x$が単調減少になるという性質を「忘れてしまった」。 これは自然対数の底であるネイピア数eも、常用対数の底である10も、1より大きな数であるという「偶然」が原因である。

幸いにも、パラメータについての変換式(割り算式および足し算式)が存在し、すべての表現を自然対数に書き換えてしまうやり方があるので、 我々の認識「自然対数は単調増加」を残したままでも、「対数関数マスター」になることは可能である!これは朗報である。

python数値計算

最後に、数値計算をして上の結果を確認しておこう。条件さえなければ、$(x,y)$は独立である。したがって、$x>0, y>0$さえ 満たされていれば、第一象限のどの場所の点も「発生してよい」。そこで乱数で発生させるのではなく、「絨毯爆撃」をかけることにする。 第一象限の「全て」の点を生成し、それが不等式の条件を満たすかどうかチェックする。満たしているものだけを記録して、グラフに図示する。そうすると、問題文の(2)のようなグラフが現れるはずである。

「すべて」と書いたが、実数は稠密な数の集合なので、数値計算ではその部分集合だけしか扱えない。つまりは離散化(デジタル化)である。 とはいえ、「解像度」をできる限り上げてやれば、問題文のグラフを定性的に再現することは可能であろう。

ということで、次のようなコードをpythonで書いてみた。

#!/usr/local/bin/python3
import math

Nmax = 100

Xmin = 0.0
Ymin = 0.0

Xmax = 2.0
Ymax = 2.0

dx = (Xmax - Xmin) / Nmax
dy = (Ymax - Ymin) / Nmax

for j in range(1, Nmax+1):
    y = j*dy
    for i in range(1, Nmax+1):
        x = i*dy
        if x != 1:
            result = math.log(y) / math.log(x)
            if (result > 0) and (result < 1):
                print(i,j,x,y,result)

x,yについての2重ループを、タブやインデントで表現するのがpythonの特徴であるが、 エディターの種類によっては空白の扱いに首尾一貫性がなくなり、エラーが頻発する。 私はterminal版のemacsで最初コードを書いていたが、

TabError : inconsistent use of tabs and spaces in indentation

のエラーがなかなか消えず途方に暮れてしまった。仕方ないので、atomエディターに切り替えて、 エラーをやっとのことで消すことができた。

$0 < x, y < 2$の範囲を100等分したメッシュ計算を行なっている。 計算結果は下のような感じになり、

1 2 0.02 0.04 0.8228161798644421
1 3 0.02 0.06 0.7191702893506187
2 3 0.04 0.06 0.874035181793704
1 4 0.02 0.08 0.6456323597288842
2 4 0.04 0.08 0.7846617209633036
3 4 0.06 0.08 0.8977461517658966
1 5 0.02 0.1 0.5885919100677789
2 5 0.04 0.1 0.7153382790366964
...

これをgnuplotで描画すると答えが再現された。