数学検定準$1$級は数Ⅲまで相当の数学の基本トピックに関して取り扱った検定であり、統計学に必要な数学を身につける際の指標に役に立ちます。当記事では「日本数学検定協会 監修」の「数学検定問題集 準$1$級」より、第$6$章の「数値計算」の解説と演習問題の解答例などを取り扱いました。
・数学検定まとめ
https://www.hello-statisticians.com/math_certificate
計算技能問題
問題.$1$
$$
\large
\begin{align}
f(x) &= x^{k} – a \\
f'(x) &= k x^{k-1}
\end{align}
$$
上記のように$f(x)$をおくとき、$\sqrt[k]{a}$は$f(x)=0$の解である。よって、$\sqrt[k]{a}$を計算するニュートン法の漸化式は下記のように得られる。
$$
\large
\begin{align}
x_{n+1} &= x_{n} – \frac{f(x_n)}{f'(x_n)} \\
&= x_{n} – \frac{x_{n}^{k} – a}{k x_{n}^{k-1}} \\
&= \frac{1}{k} \left( (k-1)x_{n} + \frac{a}{x_{n}^{k-1}} \right)
\end{align}
$$
よって、下記を実行することで初期値が$1.5$、誤差限界が$0.0001$の際の近似値が得られる。
import numpy as np
x1 = 1.5
x_n = x1
print("n: {:.0f}, x_n: {:.5f}".format(1,x_n))
x_n1 = (x_n + 2./x_n)/2.
print("n: {:.0f}, x_n: {:.5f}, delta: {:.5f}".format(2,x_n1,np.abs(x_n1-x_n)))
while np.abs(x_n1-x_n)>0.0001:
x_n = x_n1
x_n1 = (x_n + 2./x_n)/2.
print("n: {:.0f}, x_n: {:.5f}, delta: {:.5f}".format(2,x_n1,np.abs(x_n1-x_n)))
・実行結果
n: 1, x_n: 1.50000
n: 2, x_n: 1.41667, delta: 0.08333
n: 2, x_n: 1.41422, delta: 0.00245
n: 2, x_n: 1.41421, delta: 0.00000
問題.$2$
・台形公式による数値積分
$$
\large
\begin{align}
\int_{a}^{b} f(x) dx & \simeq \frac{h}{2} \left[ f(x_0) + 2(f(x_1) + \cdots f(x_{n-1})) + f(x_n) \right] \\
h &= \frac{b-a}{n}, \, a = x_0 < x_1 < \cdots < x_n = b
\end{align}
$$
上記で表した台形の公式に基づいて、下記のように数値積分を行うことができる。
import numpy as np
n = 6.
delta = (6. - 0.)/n
x = np.array([0., 1., 2., 3., 4., 5., 6.])
f_x = np.array([120., 110., 94., 78., 52., 30., 0.])
S = delta*(f_x[0] + 2*(np.sum(f_x[1:-1])) + f_x[-1])/2.
print("S: {:.1f}".format(S))
実行結果
S: 424.0
・シンプソンの公式による数値積分
$$
\begin{align}
& \int_{a}^{b} f(x) dx \\
& \simeq \frac{h}{3} \left[ f(x_0) + 4(f(x_1) + f(x_3) + \cdots f(x_{2n-1})) + 2(f(x_2) + f(x_4) + \cdots f(x_{2n-2})) + f(x_n) \right] \\
& h = \frac{b-a}{2n}, \, a = x_0 < x_1 < \cdots < x_{2n} = b
\end{align}
$$
上記で表した台形の公式に基づいて、下記のように数値積分を行うことができる。
import numpy as np
n = 6.
delta = (6. - 0.)/n
x = np.array([0., 1., 2., 3., 4., 5., 6.])
f_x = np.array([120., 110., 94., 78., 52., 30., 0.])
S = delta*(f_x[0] + 4*(f_x[1]+f_x[3]+f_x[5]) + 2*(f_x[2]+f_x[4]) + f_x[6])/3.
print("S: {:.1f}".format(S))
実行結果
S: 428.0