2

を計算するためにテイラー級数を使用してsin()います。罪のテイラー級数は次のとおりです。

シン・テイラー・シリーズ

私が使用している実装は次のようになります。

float sine(float x, int j)
{
    float val = 1;

    for (int k = j - 1; k >= 0; --k)
        val = 1 - x*x/(2*k+2)/(2*k+3)*val;

    return x * val;
}

私が理解している限り、そのコードはj多項式の項の近似値であり (つまり、近似値はjゼロから ∞ ではなく、ゼロから への総和です)、knにあり、もちろんxですx

その実装、つまり上記の式からコードへの変換を理解しようとしています。私の目標は、cos()シリーズで同じ種類の実装を作成することです。

それを理解するのを手伝ってもらえますか?

4

1 に答える 1

4

マクローリン級数ですが、級数の一般項の漸化式を利用して計算回数を減らすように書かれています。

cosine のバージョンは次のとおりです (単純なテスト ハーネスと共に)。

#include <stdio.h>
#include <math.h>

float cosine(float x, int j)
{
    float val = 1;
    for (int k = j - 1; k >= 0; --k)
        val = 1 - x*x/(2*k+2)/(2*k+1)*val;
    return val;
}

int main( void )
{
    for( double x = 0.0; x <= 1.57; x += 0.1 )
    {
        printf("%10g    %10g    %10g\n", x, cos(x), cosine(x, 5));
    }
    return 0;
}

EDIT(醜いテキスト計算をLaTeXで作成された画像に置き換えました)

sineこのトリックを理解するために、例に焦点を当てて、正弦関数のマクローリン展開を思い出してみましょう。

正弦関数のマクローリン展開

ここで、第 5 項 (N=5) まで展開し、剰余 R を無視して x 2項の因数分解を含むいくつかの書き換えを行います。結果の手順を以下に説明します。ここで、書き換えられた部分式は角括弧内の数字でマークされています。

書き換え手順

C 関数は、ボトムアップからのこの再帰的な書き換えの単なる実装です。つまり、上記のスキーマの最後のステップとして表示されるものは、sine関数で最初に計算されます (この例は、で始まる呼び出しに関連しているj==4ため、ループ変数kはで始まります)と の値は)3に下がり0ます。

于 2013-09-14T22:06:31.680 に答える