ホーム ] PC技術/システム技術 ] VB.NETプログラミング ] なるほどナレッジ ] インフォメーション ]

上へ
平方根
立方根
整数指数
実数指数(Exp)
実数指数(一般)
対数
正弦/余弦
正接
逆正弦/逆余弦
逆正接
双曲線正弦/余弦
双曲線正接
逆双曲線正弦
階乗評価関数
級数評価関数
演算時間評価関数

数学関数

正弦/余弦

最終更新日:2006/06/06

●概要

 級数展開にて求める。但し、そのままでは収束が遅いので工夫が必要となる。

●級数

○定義

 以下の展開式を用いる。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
cos(X / 2) = 2 * (cos(X / 4))2 - 1
cos(X / 4) = 2 * (cos(X / 8))2 - 1
cos(X / 8) = 2 * (cos(X / 16))2 - 1
・・・・・・・・・・・・・・
Cn+1 = f(X / Cn)             [ cos の場合は、C = 2]

となる。これは漸化式となる。例えば、X / 16 でcos を求めれば、これから、cos(X / 8) → cos(X / 4 ) →・・・・ cos(X) を以下のように単純な演算で算出できることになる。

N を漸化段数とする。
Y は、変数 X を 2N で除した数で求めた級数値

For i = 1 To N
   Y = Subt(Mul(Mul(Y,Y),2),1)
Next

Y は Cos(X) となる。

理論上、X はいくらでも小さくできる。現実的には、漸化式の段数と級数の収束度との関係で決める必要がある。

○N倍角公式

 以下のように、それぞれ、2 〜 5 まで掲げてみた。

・2倍角の公式

  sin2θ=2sinθcosθ
 cos2θ=2cos2θ−1

・3倍角の公式

 sin3θ=3sinθ−4sin3θ
 cos3θ=4cos3θ−3cosθ

・4倍角の公式

  sin4θ=4sinθcosθ−8sin3θcosθ
 cos4θ=8cos4θ−8cos2θ+1

・5倍角の公式

  sin5θ=16sin5θ−20sin3θ+5sinθ
 cos5θ=16cos5θ−20cos3θ+5cosθ

○適用する倍角

 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桁程度の初期値の差がでないと考えられる。


変数は、6桁程度の精度の数値