1

ユーザーから値xと整数nを取得するプログラムを作成しました。このプログラムは、arcsinのテイラー級数を使用してarcsin(x)を出力します http://tedmuller.us/Math/img/Taylor-arcsin.gif

しかし、何らかの理由でそれは機能していません。x = 1と入力すると、pi/2ではなく1.19の出力が得られます。

これが私のコードです:

#include <stdio.h>
#include <conio.h>
void main()
{
    int i,n;
    double x,sum,last;
    printf("Please enter the x you wish to calculate arcsin(x) for \n");
    scanf("%lf",&x);
    printf("Enter n\n");
    scanf("%d",&n);
    last=x;
    sum=last;
    for(i=1;i<=n;i++)
    {
        last*=((x*x)*(2*i-1))/((2*i)*(2*i+1));
        sum+=last;
    }
    printf("arcsin(%lf) = %lf",x,sum);
    getch();
}

基本的な考え方は次のとおりです。最後と合計は両方ともxの値で始まります。それから私は最後に進んでシリーズの次の番号になり、それを合計に追加し、最後にもう一度進み、合計に追加します...すすぎ、n回繰り返します。

4

3 に答える 3

2

1つの問題は、x = 1の場合、その級数が対数的に速く収束することです。x=1がアークサインの収束半径の境界にあることに注意してください。したがって、収束が非常に遅くなるのは当然のことです。

より大きな問題は、実装したと思っていたシリーズを実際に実装しなかったことです。線形に収束するものを合計しています。それはよく知られている何かの不可欠なもののように見えますが、それは確かにアークサインではありません。

于 2013-02-06T06:28:05.387 に答える
2

拡張に間違いがあるようです。

これを試して: last*=((x*x)*(2*i-1)*(2*i-1))/((2*i)*(2*i+1))

まだたくさんの用語が必要です。1000の用語で私は得arcsin(1.0) ~= 1.552963ます。(あなたのコード1.194958)

10000用語arcsin(1.0) ~= 1.565155。(あなたのコード1.194958)

于 2013-02-06T06:43:36.830 に答える
2

展開したテイラー級数の精度は、6桁|x| < .5、5桁|x| < .6、4桁|x| < .7、3桁|x| < .8、2桁です|x| < .9

もちろん、テイラー多項式が特定の次数の最良の多項式であると考える理由はありません。数値解析へようこそ。

|x| = 1arcsin(x)の導関数はに極を持ち、そのテイラー級数の収束が非常に遅いため、x = 1適切な推定を得るにはあまりにも多くの項が必要です。これは、テイラー展開が小さなxを除いて、arcsin(x)を近似する効率的な方法ではないことを意味します。計算しながら展開の各項を印刷すると、級数を妥当な時間で収束させるのは非常に小さいことがわかります。

あなたの援助のために、ミルトン・アブラモウィッツとアイリーン・ステガンは彼らの著書「数学関数のハンドブック」、p.81でこの近似式を導き出します:

arcsin(x) = pi/2 - sqrt(1 - x)(a0 + a1*x + a2*x^2 + a3*x^3)

どこ

a0 = 1.5707288
a1 = -0.2121144
a2 = 0.0742610
a3 = -0.0187293

これは、1の近くではるかに優れたパフォーマンスを発揮します。

于 2013-02-06T06:44:21.327 に答える