|
|
●概要 級数展開にて求める。但し、そのままでは収束が遅いので工夫が必要となる。 ●級数 ○定義 以下の展開式を用いる。tan は、sin、cosから求める。 ・sin(x) = (-1)k * x(2*k+1) /(2 * k + 1)! [k = 0 to ∞] ・cos(x) = (-1)k * x(2*k) /(2 * k)! [k = 0 to ∞] ○収束の予測 sin、cos の収束はほぼ同じで、SeriesLastItem関数にて展開した表(Factorial3の表)の通りとなる。変数Xのオーダが小さいほど収束が速くなるので、オーダを以下に小さくするかが課題となる。 ●X を小さくする ○原理 倍角公式を漸化式にして、X を、X / Cn にしてしまう。一般式だと分かりづらいので、具体的に説明する。 cos の2倍角公式は、 cos(2 * X) = 2 * (cos(X))2 - 1 であるが、これを書き換えると。 cos(X) = 2 * (cos(X / 2))2 - 1 となる。これを更に、 cos(X / 2) = 2 * (cos(X / 4))2 - 1 とできる。列挙すれば、 cos(X) = 2 * (cos(X / 2))2 - 1 となる。これは漸化式となる。例えば、X / 16 でcos を求めれば、これから、cos(X / 8) → cos(X / 4 ) →・・・・ cos(X) を以下のように単純な演算で算出できることになる。
理論上、X はいくらでも小さくできる。現実的には、漸化式の段数と級数の収束度との関係で決める必要がある。 ○N倍角公式 以下のように、それぞれ、2 〜 5 まで掲げてみた。 ・2倍角の公式 sin2θ=2sinθcosθ ・3倍角の公式 sin3θ=3sinθ−4sin3θ ・4倍角の公式 sin4θ=4sinθcosθ−8sin3θcosθ ・5倍角の公式 sin5θ=16sin5θ−20sin3θ+5sinθ ○適用する倍角 sin では、cos が現れる倍角公式は使えない。また、2倍角では効率が悪い。3倍角では、1/3 が、徒に語長をのばしてしまう可能性が高い。sin、cos で、同じ漸化式になり、効率が高い5倍角を双方に採用する。漸化の段数はとりあえず10 とする。実験では、10段での漸化式の演算時間は、比較的短い。10 段では、510 = 9765625 となり、π/3 で、100万桁を5万項目で求められる。 下表は、変数を精度桁数にして、級数直接、漸化10段、漸化15段での演算時間を実測したもの。15段では、精度が高くなると効果が現れてくる。
○準備 周期関数なので、与えられた変数を0 〜 2π の周期内に変換する必要がある。これは、変数から 2π による整数除算と剰余を求めて、剰余を周期内値として使用している。この時、変数範囲をもう少し狭い範囲にする方法がある。例えば、0 〜 π/4 や π/2 に押さえ込こむことができる。しかし、変数として、0 〜 2π までを実際に当てはめてsin の演算時間を実測したところ、その範囲では、有意差はなかった。これは、倍角による漸化式にて、十分に小さくなるので、1桁程度の初期値の差がでないと考えられる。
|