問題の解説などは受講生がCプログラムを書けることを想定しているが、課題のプログラムは他言語で書いても良い。ただし、浮動小数点数の計算が可能な言語に限る。
\(\sum_{n=1}^{2^{28}}(1/n^2)\) を計算するプログラムを、
以下のそれぞれのアルゴリズムを実装する形で書き、実行し、誤差の考察をせよ。
それぞれ、float
とdouble
で実装して、違いについても実験・考察せよ。
\(2^{28}=16^7\)であるので、\(2^{28}\)はCでは 0x10000000
と書ける。
\(2^{28}\)がint
の範囲におさまるかどうかは処理系依存である。移植性を重視するなら、ループカウンタにint
型の変数は使わずにlong
型を使うが安全である。
int32_t
型を使うと、さらに安全確実になる。int32_t
型をサポートする処理系ならば、そのビット幅は確実に32ビットである。なお、これを使うには、#include <stdint.h>
が必要である。
一般に、\(n\)を\(1\)から\(N\)まで動かして\(1/n^2\)を使って何かするには、例えば、次のようなコードを書くとうまくいく。
for (long n = 1; n <= N; n ++) { double t = n; double x = 1 / (t * t); /* ここで x を使って何かする */ }
そのため、整数型のループカウンタの値をいったん浮動小数点数に変換して使用する形にすれば良い。Cなどのプログラミング言語では、整数型の変数から浮動小数点数型の変数に代入を行うと、型変換を行うコードを自動的に追加してくれる。
\[ \begin{aligned} f(-2) &= 1/4, \\ f(-1) &= 1/2, \\ f(0) &= 1, \\ f(1) &= 2, \\ f(2) &= 4 \end{aligned} \] から以下のそれぞれの補間法で\(f(-3)\), \(f(-1/2)\), \(f(3/2)\), \(f(10)\)の近似値を計算し、\(f(x)=2^x\) との誤差を評価せよ。
\(a\gt0\) と仮定し、\(f(x)=xe^x-a\) とおく。 このとき、以下が成り立つ。
したがって、解は区間\((0,a)\)にちょうど一つあることと、\(f\)は\((0,+\infty)\)で単調増加かつ下に凸であることがわかる。
ヒント1の事実を利用すると、初期値を以下のように選ぶとうまくいくことがわかる。
\(f(x)=x^3-3ax^2-3x+a\) とおくと \(a\gt0\) のとき以下が成り立つ。 \[ \begin{gathered} f(-2)\lt0, \\ f(0)\gt0, \\ f(1)\lt0, \\ f(a)\lt0, \\ f(3a+2)\gt0. \end{gathered} \]
三角形\(ABC\)の外心を\(O\)とし、外接円半径を\(r_O\)とする。外心は頂点から等距離にあることから、\[\tag{☂︎}\overline{OA}^2=\overline{OB}^2=\overline{OC}^2={r_O}^2 \] が成り立つ。 頂点と外心の座標を \(A=(x_A,y_A)\), \(B=(x_B,y_B)\), \(C=(x_C,y_C)\), \(O=(x_O,y_O)\) とおくと、(☂︎)は \[ \tag{☂︎☂︎} \left\{ \begin{aligned} (x_O-x_A)^2+(y_O-y_A)^2-{r_O}^2 &= 0 \\ (x_O-x_B)^2+(y_O-y_B)^2-{r_O}^2 &= 0 \\ (x_O-x_C)^2+(y_O-y_C)^2-{r_O}^2 &= 0 \end{aligned} \right. \] と書ける。 したがって、(☂︎☂︎)を\(x_O\)と\(y_O\)と\(r_O\)の方程式とみなして解くと、三角形の頂点の座標から外心の座標と外接円半径を計算できる。
aは、 \[ \begin{gathered} x^{(n)}= \begin{bmatrix} x_O^{(n)} \\ y_O^{(n)} \\ r_O^{(n)} \end{bmatrix} \\ f(x_O, y_O, r_O)= \begin{bmatrix} (x_O-x_A)^2+(y_O-y_A)^2-{r_O}^2 \\ (x_O-x_B)^2+(y_O-y_B)^2-{r_O}^2 \\ (x_O-x_C)^2+(y_O-y_C)^2-{r_O}^2 \end{bmatrix} \end{gathered} \] とおいて、多変数のニュートン法を適用すればよい。
以下のそれぞれの数列について、その極限値を素朴に計算するプログラムとエイトケン加速を適用するプログラムとエイトケン加速を2回適用するプログラムを書き、収束の速さを比較せよ。
以下の常微分方程式を以下のそれぞれの方法で\(0\le t\le 2\)の範囲で数値的に解き、精度を比較せよ。 \[ \frac{dx}{dt}=2xt,\qquad x(0)=1. \]
この常微分方程式は解析的に解ける。