はじめに
3次関数のグラフの概形を描写するためには微分法を用いるのが一般的である。
微分法を用いることで、目的の関数の増減や変曲点がある場合はその位置を知ることができる。
そこで、今回は2つの極値が存在する3次関数を用いてそのグラフの概形について調査する。
具体的には、1次導関数と2次導関数の値が3次関数の形状にどのような影響を与えるのか調査する。
また、3次関数の対称性(極大点、極小点の中点は、変曲点になる性質)について議論する。
その際に、計算機を用いて具体的な3次関数のグラフを描写することで視覚的にも理解することも目的とする。
今回扱う3次関数のイメージ
今回扱う3次関数のイメージ その2
問題設定
$f(x)=ax^3+bx^2+cx+d$という3次関数(今回は、簡単のため$a>0$、極大点、極小点が存在する)の概形を調査する。
ただし、計算機によるグラフの描写については、
a=1,b=0,c=-3,d=0
を用いた。
解法
1次導関数
定義
目的の関数の増減を調査するために、1次導関数を算出する。1次導関数の定義は以下の通りである。
f'(x)=\lim_{h\to +0}\frac{f(x+h)-f(x)}{h}
したがって、$f`(x)$の符号は$f(x)$の増減に対応する。
具体的には、
$f'(x)>0$であるとき、$f(x+h)-f(x)>0$より、$f(x)$は増加する。
$f'(x)<0$であるとき、$f(x+h)-f(x)<0$より、$f(x)$は減少する。
$f'(x)=0$であるとき、$f(x+h)-f(x)=0$より、$f(x)$は同じ値を維持する。
つまり、増加も減少をしない
3次関数の場合
今回の3次関数の1次導関数は以下の通りである。
f'(x)=3a x^2+2bx+c
したがって、
f'(x)=3a x^2+2bx+c=0
となる$x$を求めると、以下の通りである。
x=\frac{-b\pm\sqrt{b^2-3ac}}{3a}(=x_a,x_b)
ただし$x_a>x_b$とする。
$a>0$より、$x_a$で極大値を取り、$x_b$で極小値を取る。
極値の算出
さて、3次関数$f(x)$の極値を算出してみよう。
$f(x_a),f(x_b)$を直接求めてよいが、ここではテクニカルなことをして計算量を減らす。
$f(x)$を$f'(x)$で除することを考える。つまり商$Q(x)$と余り$R(x)$を用いて以下の等式を作成する。
f(x)=f'(x)Q(x)+R(x)
つまり、
f(x)=f'(x)(\frac{1}{3}x+\frac{b}{9a})+(\frac{6ac-2b^2}{9a}x+d)
ここで、$f'(x_a)=f'(x_b)=0$となることから、
f(x_a)=R(x_a)=(\frac{6ac-2b^2}{9a})x_a+(d-\frac{bc}{9a})
f(x_b)=R(x_b)=(\frac{6ac-2b^2}{9a})x_b+(d-\frac{bc}{9a})
ここで、極大点及び極小点の中点$(x_d,y_d)$を考える。
x_d=\frac{x_a+x_b}{2}=-\frac{b}{3a}
y_d=\frac{f(x_a)+f(x_b)}{2}=(\frac{6ac-2b^2}{9a})x_d+d=(\frac{6ac-2b^2}{9a})(-\frac{b}{3a})+(d-\frac{bc}{9a})=\frac{2b^3-9abc}{27a^2}+d
これが変曲点に一致するか調査する。
2次導関数
定義
目的の関数の増減を調査するために、2次導関数を算出する。2次導関数の定義は以下の通りである。
f''(x)=\lim_{h\to +0}\frac{f'(x+h)-f'(x)}{h}
つまり、$f''(x)>0$ならば、増減が増の方向にどんどん増えていく。つまり、下に凸の形になる。
(具体例として2次関数で考えると分かりやすい。$y=x^2$とかが代表的な例である。)
一方で、$f''(x)<0$ならば、増減が減の方向にどんどん減っていく。つまり、上に凸の形になる。
(具体例として2次関数で考えると分かりやすい。$y=-x^2$とかが代表的な例である。)
最後に、$f''(x)=0$ならば、傾きの値が保存される。つまり、前後で$f''(x)$の符号が入れ替われば、変曲点を持つこととなる。
3次関数の場合
今回の3次関数の2次導関数は以下の通りである。
f''(x)=6ax+2b=6a(x+\frac{b}{3a})
したがって、変曲点$(x_c,y_c)$は以下の通りである。
x_c=-\frac{b}{3a}
y_c=f(-\frac{b}{3a})=\frac{2b^3-9abc}{27a^2}+d
以上のことから、変曲点$(x_c,y_c)$は極大点、極小点の中点$(x_d,y_d)$と一致する。
ただし、これは3次関数のような特別な場合のみであることに注意する。
変曲点の意味について
ちなみに、変曲点は凸の方向が切り替わる点のことである。つまり$S$字の中点に値する。
したがって、変曲点に接線を引くと以下の通りになる。

つまり傾きの値が極大または極小になるときが変曲点である。
増減表
今回のグラフの増減表を以下に示す。
| x | $\cdot \cdot \cdot$ | $x_b$ | $\cdot \cdot \cdot$ | $x_c$ | $\cdot \cdot \cdot$ | $x_a$ | $\cdot \cdot \cdot$ |
|---|---|---|---|---|---|---|---|
| $f(x) $ | $\nearrow$ | $f(x_b)$ | $\searrow$ | $f(x_c)$ | $\searrow$ | $f(x_a)$ | $\nearrow$ |
| $f'(x) $ | $+$ | $0$ | $-$ | $-$ | $-$ | $0$ | $+$ |
| $f''(x) $ | $-$ | $-$ | $-$ | $0$ | $+$ | $+$ | $+$ |
まとめ
今回は、3次関数の概形について考察をした。具体的には、2つの極値が存在する3次関数の概形を微分法を用いることで考察した。具体的には、1次導関数と2次導関数を算出することで、増減と変曲点について調査した。
また、後半では、変曲点を中心とした、3次関数の対称性について議論した。
プログラム
今回使用したプログラムを以下に示す。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
# ==========================================
# 1. 設定・パラメータ定義
# ==========================================
L = 2
n = 1000
x_ary = np.linspace(-L, L, n)
# 3次関数の係数 (y = ax^3 + bx^2 + cx + d)
a = 1
b = 0
c = -3
d = 0
# ==========================================
# 2. 関数・数値微分の定義
# ==========================================
# 目的の関数(今回は2つの極値が存在する3次関数)
def f(x_ary):
y_ary = a * x_ary**3 + b * x_ary**2 + c * x_ary + d
return y_ary
# 微分用関数 (数値解析を用いた前進差分近似)
def diff_f(f_ary, n, dfdx_ary):
dx = 2 * L / n
for i in range(n):
if i < n - 1:
dydx = (f_ary[i+1] - f_ary[i]) / dx
dfdx_ary[i] = dydx
else:
# 末尾の要素は計算不可のためNaNを代入
dfdx_ary[i] = np.nan
return dfdx_ary
# 計算の実行
y_ary = f(x_ary)
dydx_ary = np.zeros(n)
dydx_ary = diff_f(y_ary, n, dydx_ary)
ddydxx_ary = np.zeros(n)
ddydxx_ary = diff_f(dydx_ary, n, ddydxx_ary)
# ==========================================
# 3. 特徴点(極値・変曲点)の算出(理論解)
# ==========================================
# 極値をとるx座標 (1次導関数の解)
x_a = (-b + (b**2 - 3 * a * c)**0.5) / (3 * a)
x_b = (-b - (b**2 - 3 * a * c)**0.5) / (3 * a)
# 変曲点のx座標 (2次導関数の解)
x_c = -b / (3 * a)
# 各点のy座標
y_a, y_b, y_c = f(x_a), f(x_b), f(x_c)
# ==========================================
# 4. グラフの描画・保存
# ==========================================
# --- 3次関数の基本グラフ ---
plt.figure()
plt.grid()
plt.title("3次関数のグラフ")
plt.scatter(x_a, y_a, color="black")
plt.scatter(x_b, y_b, color="black")
plt.plot(x_ary, y_ary, color="blue")
plt.savefig("3次関数のグラフ.png")
plt.show()
# --- 変曲点の接線あり ---
plt.figure()
plt.grid()
plt.title("3次関数のグラフ(接線あり)")
# 接線の方程式: y = f'(x_c)(x - x_c) + f(x_c)
# ※元のコードの数式: (3ax_c + 2bx_c + c) は厳密には微分の定義に則った接線の傾き
yy_ary = (3 * a * x_c**2 + 2 * b * x_c + c) * (x_ary - x_c) + y_c # 元の式の微調整
# 注:元のコードの記述を尊重しつつ、数式として成立するよう微修正しています。
plt.plot(x_ary, yy_ary, color="red")
plt.scatter(x_a, y_a, color="black")
plt.scatter(x_b, y_b, color="black")
plt.scatter(x_c, y_c, color="black")
plt.plot(x_ary, y_ary, color="blue")
plt.savefig("3次関数のグラフ_変曲点を通る接線あり.png")
plt.show()
# --- 1次導関数のグラフ(極値の算出) ---
plt.figure()
plt.title("1次導関数のグラフ")
plt.grid()
plt.axhline(0, color='black')
plt.plot(x_ary, dydx_ary)
plt.savefig("3次関数のグラフの1次導関数のグラフ.png")
plt.show()
# --- 2次導関数のグラフ(変曲点の算出) ---
plt.figure()
plt.title("2次導関数のグラフ")
plt.grid()
plt.axhline(0, color='black')
plt.plot(x_ary, ddydxx_ary)
plt.savefig("3次関数のグラフの2次導関数のグラフ.png")
plt.show()
参考文献


