x^2 や e^x のような関数を考えれば、連続関数が微分可能であることは疑いのない事実のように感じられるかもしれません。もちろん折れ曲がった点では微分できませんが、そのような点は数えられる程度しか存在しないはず…ですが、実際にはそうではない関数が存在します。何か応用があるわけではありませんが、面白いかもしれないので解説します。
最初にそのような関数を発見したのはワイエルシュトラス(Weierstrass)ですが、ここで挙げるのはファン・デル・ヴェルデン(van der Waerden)によるもの(参考文書[1])です。
すべての点で微分不可能な連続関数
x と x に最も近い整数との距離を [x] と書くことにすると、
(一般的な記号ではありません)
f(x) = \sum_{n = 0}^\infty \frac{[10^n x]}{10^n}
が、すべての点で微分不可能な関数です。
すべての点で値を持つこと
[10^n x] > 0 であり
\sum_{n = 0}^\infty \frac{[10^n x]}{10^n} < \sum_{n = 0}^\infty \frac{1}{10^n} = \frac{10}{9}
であることから、この和はすべての点で収束します。つまり、f(x) はすべての点で値を持ちます。
x = \frac{1}{3} = 0.333 \cdots
であれば、
[10^n x] = [\cdots 33.333 \cdots] = 0.333 \cdots = \frac{1}{3}
なので
f\left(\frac{1}{3}\right) = \frac{1}{3} \sum_{n = 0}^\infty \frac{1}{10^n} = \frac{10}{27}
です。
f(0) = f(1) = 0 であり、f(x + 1) = f(x) なので、周期1の周期関数です。
グラフを描くと、
import matplotlib.pyplot as plt
import numpy as np
def distance_from_nearest_integer(x):
decimal = x - np.floor(x)
if decimal < 0.5:
return decimal
else:
return 1 - decimal
def nondifferentiable_func(x):
eps = 10**(-6)
y = 0
for n in range(1000):
dy = distance_from_nearest_integer((10**n)*x) / (10**n)
if dy < eps:
break
y += dy
else:
raise Exception(f"convergence error dy = {dy}")
return y
x = np.linspace(0 ,1, 300)
y = list(map(nondifferentiable_func, x))
plt.plot(x, y)
plt.title("$f(x)$", math_fontfamily="cm")
plt.show()
連続であること
[x] は、0 \le x \le 1 で
[x] = \begin{cases} x & (x < 0.5) \\ 1 - x & (x \ge 5) \end{cases}
という関数です。それ以外の区間もこれの繰り返しなので、明らかに連続です。同様に、[10^n x] も連続なので、f(x) は連続関数です。
正確には、極限である f(x) が連続関数であるためには、この級数が一様収束であることを言う必要があります。これは、
f_n(x) = \frac{[10^n x]}{10^n} < \frac{1}{10^n} = M_n
として、ワイエルシュトラスのM判定法(Wikipedia)を適用すればよいです。
微分不可能であること
\frac{f(x + h) - f(x)}{h} = \frac{1}{h} \sum_{n = 0}^\infty \frac{[10^n (x + h)] - [10^n x]}{10^n}
が収束しないことを示します。
x の小数点以下の各桁を a_i とおいて
x = \cdots\ .a_1 a_2 a_3 \cdots
と表すと、
[10^n x] = \begin{cases} 0.a_{n+1} a_{n+2} \cdots & (a_{n+1} < 5) \\ 1 - 0.a_{n+1} a_{n+2} \cdots & (a_{n+1} \ge 5) \end{cases}
となります。
h_m = 10^{-m} とおくと
\begin{align*} \frac{f(x + h_m) - f(x)}{h_m} &= \frac{1}{10^{-m}} \sum_{n = 0}^\infty \frac{[10^n (x + 10^{-m})] - [10^n x]}{10^n} \\ &= \sum_{n = 0}^\infty \frac{[10^n x + 10^{n-m}] - [10^n x]}{10^{n-m}} \end{align*}
n を大きくしていくと、n = m 以降は 10^{n-m} > 0 であり [10^n x + 10^{n-m}] と [10^n x] の小数点以下は同じになります。つまり、[10^n x + 10^{n-m}] - [10^n x] = 0 です。
無限和は有限和になり、
\frac{f(x + h_m) - f(x)}{h_m} = \sum_{n = 0}^{m-1} \frac{[10^n x + 10^{n-m}] - [10^n x]}{10^{n-m}}
n = m - 1 のとき
\begin{align*} [10^n x + 10^{n-m}] &= 0.(a_m + 1) a_{m+1} \cdots \\ [10^n x] &= 0.(a_m) a_{m+1} \cdots \end{align*}
ここで、右辺の () は小数点第一位の値を表します。
a_m が 4 のときは 0.5 を、9 のときは 0 をまたいでしまいます。そこで、
h_m = \begin{cases} -10^{-m} & (a_m = 4,9) \\ 10^{-m} & それ以外 \end{cases}
と定義すると、n < m に対して
[10^n (x + h_m)] - [10^n x] = \begin{cases} -10^{n-m} & (a_m = 4,9) \\ 10^{n-m} & それ以外 \end{cases}
となります。a_m の値によって符号が変わりますが、x を固定すれば a_m が決まり、符号が確定します。この m に対して、すべての n\ (< m) で上式は同符号になります。
これより、
\frac{f(x + h_m) - f(x)}{h_m} = \sum_{n = 0}^{m-1} \frac{\pm 10^{n-m}}{10^{n-m}} = \pm m
x = 0.1459 \cdots であれば \{h_m\} = \{0.1, -0.01, 0.001, -0.0001, \cdots\} のように取るわけですが、このとき左辺 = \{1, -2, 3, -4, \cdots \} となり、収束しないのは明白です。
0 に向かうどのような数列に対しても左辺が同じ値に収束しなければ、微分可能とは言いません。収束しない列 \{h_m\} が存在する以上、f(x) は x = 0.1459 \cdots で微分不可能と結論づけられます。任意の x に対して同じような \{h_m\} を取ることができるので、f(x) はすべての点で微分不可能です。
まとめ
すべての点で微分不可能な連続関数の具体例を挙げ、それが実際に微分不可能であることを示しました。大学一年レベルの解析も多少使っていますが、それ以外は高校レベルなので、高校生でも理解できるかもしれません。
考えれば考えるほど、このような直観に反する関数の存在を認めざるを得なくなる、というのも数学の面白いところです。
参考文書
[1] Riesz-Nagy, Functional Analysis