ウォリスの公式
たまには円周率のことを考えようと思い、まずはウォリスの公式から.
こちらもWiki1がシンプルで分かりやすい.
この式の導出は歴史2を見る感じ1655年.17世紀なんですね.
式としては要は
となるわけである.
実際に求めたい際は以下のように変形すればよい.
これを計算すればよいが、もちろん全部を足し合わせるのは計算では不可能...
なので、途中まで計算して打ち切るということになる.
今回は実装として基底としてCalcFrameを用意.
class CalcFrame
{
public:
virtual void Step() = 0;
const Array<double> GetSamples() const { return m_values; }
void InitValue(const double& value, const int iterate = 1) { m_iterateValue = value; m_iterate = 1; }
protected:
Array<double> m_values;
double m_iterateValue; int m_iterate;
};
Step関数を呼び出しあげればIterateが行われることになる.初期値に関しては
InitValueで指定可能.また、
GetSamplesで全Valueを取得できる.
Wallisは次のように定義.
まず初期値は2.0で用意する、総積前の2に該当.
そしたら後は総積の部分を各Iterateで計算するだけ.
まず最初にを計算して、それを当てはめる.
これだけで計算が出来る.式としては非常にシンプルな形.
void Step() override
{
double n = (2.0 * static_cast<double>(m_iterate));
n *= n;
m_iterateValue *= n / (n - 1.0);
// 更新
m_values.push_back(m_iterateValue);
m_iterate++;
}
これを描画した結果は以下のようになる.
青い線がで、赤い線がウォリスの公式.
一応収束していってるのは分かるが、収束速度は非常に遅い.
実際にあまり収束速度は良くないらしい.
ということで今回はここまで、次回はグレゴリー級数でもやろうかな.