• ベストアンサー

sinxの数値計算

sinxの数値計算 任意のxに対するsinxの値をマクローリン展開を利用して近似し、誤差の限界(n番目の値が1*10^-8)になるまでもとめよ。 という問題なんですが、for文でいろいろやってみたのですが、n番目の値が1*10^-8までというのがどうしてもできません。 C言語です。 ヒントだけでもいいので教えてください。 明後日の試験にこれの類題が出るようなので、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

マクローリン展開を行うと、添付した式の赤枠内の部分式の値の絶対値が徐々に0に近付きます。 これは「分数式の分母がどんどん大きくなる」からです。 プログラムは、きっと double sinx(double x) { double ans=0.0; double an; int n; n = 1; while (1) { an = 赤枠の部分式; if ((an < 1e-8) && (an > -1e-8)) break; //誤差の限界 ans += an; } return ans; } と言う感じになります。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

(-1)^n x^(2n+1)/(2n+1)! = [(-1)^(n-1) x^(2n-1) / (2n-1)!] × -x^2/[(2n)(2n+1)] だから, 1つ前の項の値がわかればいい, だけだよね? ま, 実際にはこんなふうにすると誤差が出てしょうがないんだけど.

wainder
質問者

補足

式の意味は分かるのですが、プログラムにすることができません。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

><Math.h>などは使わない方法を教えていただきたいです。 #3さんの回答には、どこにもmath.hを使う場面は出てきません。 >プログラムを全部載せていただいた方が助かります。 sinx関数のソースは提示されているのですから、 後は、それをmain関数(あなたが作ります)から どのように呼び出すか、だけです。 # マクローリン展開そのものは理解されているのですよね?

wainder
質問者

補足

数学は得意なのでマクローリンは理解しています。赤枠の中の表記の仕方がわからないです。

回答No.3

訂正。 double sinx(double x) { double ans=0.0; double an; int n; n = 1; while (1) { an = 赤枠の部分式; if ((an < 1e-8) && (an > -1e-8)) break; //誤差の限界 ans += an; n += 2; //nを増やすの忘れたので追加 } return ans; }

wainder
質問者

補足

すみません。まだ授業でもそれほど高度なことはやっていないので、<Math.h>などは使わない方法を教えていただきたいです。プログラムを全部載せていただいた方が助かります。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>for文でいろいろやってみた その、いろいろやってみた、というソースを示してください。

wainder
質問者

補足

for(i=-10;i<=10;i++){ v=(-1); sinx=0; k=1; l=1; x=i*0.1; for(j=1,m=1;j<=10,m<=10;j++,m++){ l=x*l; k=j*k; d=l/k; if (m%2!=0 && d>0.000001){ v=v*(-1); sinx=sinx+v*d; } if(d>0.000001){ printf("x=%g sinx=%g\n",x,sinx); break; }else if(d==0){printf("x=0 sinx=0\n");}

関連するQ&A

専門家に質問してみよう