数学検定準1級 解説 〜公式問題集 解説&解答 Ch.6「数値計算」〜

数学検定準$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

数理技能問題

問題.$1$