C言語でのsinxのマクローリン展開について

このQ&Aのポイント
  • C言語を使ってsinxのマクローリン展開を近似するプログラムが間違った値を出力してしまう。
  • プログラムの修正点を指摘してほしい。
  • プログラムでは任意のxに対するsinxの値を求めるための級数を計算している。
回答を見る
  • ベストアンサー

C言語でのsinxのマクローリン展開について

課題で、「n 番目の値が、1*10^-8 よりも小さくなるまでの級数を求め任意のxに対するsinxの値をマクローリン展開を利用して近似せよ。」というものが出たので、プログラムを作成してみたのですが、間違った値が出力されてしまいます。以下にプログラムを示しますので、間違っている点の指摘をお願いします。 #include<stdio.h> int main(void) { long double a,b,c,d,n,x,ans,xx; ans = 0; a = c = d = 1; printf("xを入力"); scanf("%lf",&x); b = x; for(n = 1; d >= 1e-8; a *= (n - 1) * n , b *= xx){ xx = x * x; d = b / a; ans += (b * c)/a; c *= -1; n += 2; } printf("%.8f",ans); return 0; }

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

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

double型では精度が足りないのでしょうか。 long double型を使うのであれば#1の回答で指摘されたように、%lfや%fではなく%Lfを使うべきです。 (もしや、xの値をラジアン単位ではなく、度の単位で与えていたりしませんか)

site41
質問者

お礼

>>もしや、xの値をラジアン単位ではなく、度の単位で与えていたりしませんか その通りでした!ありがとうございます!

その他の回答 (3)

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

手元で確認しましたが, for の a *= (n-1)*n で処理されているのでそこは問題ないはずです>#2. なんで n が int じゃないんだろうかという疑問は残りますが.

site41
質問者

お礼

xを度で入力していました・・・回答ありがとうございました!

  • honor
  • ベストアンサー率35% (25/71)
回答No.2

sinのマクローリン展開はn番目の係数が1/(2n-1)! ではありませんか? 1/(2n-1) になってる気がします。

site41
質問者

お礼

xを度で入力していました・・・回答ありがとうございました!

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

とりあえず scanf と printf

site41
質問者

お礼

xを度で入力していました・・・回答ありがとうございました!

関連するQ&A

  • C言語の、sinxのマクローリン展開を教えて下さい

    C言語の、sinxのテイラー(マクローリン)展開を求めるプログラムを教えて下さい。 sinx=x-(x^3)/3!+(x^5)/5!-(x^7)/7!+(x^9)/9!・・・ となっており、 整数nと実数xを入力すると 第n項までの和を求めるプログラムを作らないといけません。 以下は、私が作ったプログラムです。 #include<stdio.h> #include<math.h> int main(void) { int i,n; double x,kotae,tmp; printf("n=? \n"); scanf("%d",&n); printf("x=? \n"); scanf("%lf",&x); kotae=x; tmp=1; for(i=1;i<n;i++) { tmp=tmp*(-1)*x*x/(2*i)/(2*i+1); kotae=kotae+tmp; } printf("sin%fのテイラー展開第%d項までの和は%f \n",x,n,kotae); return 0; } 作ったのですが、うまくいきません n=2、x=2にすると1.3333・・・とかになってしまいます どうすればいいでしょうか? 分かる方、お願いします。

  • 微分積分(大学) マクローリン展開

    微積分(大学) マクローリン展開 次の関数をマクローリン展開せよ。 (1) f(x)=(sinx-x)/x^3 (2) f(x)= xcosx-sinx 級数Σ(n=2→∞){1/ n(n-1)}x^nの関数をf(x)とするとき、f"(x)を求めることによって、f(x)を定めよ。 御教授宜しくお願いします。

  • C言語で計算が合いません(初心者)

    C言語で計算が合いません(初心者) 簡単な計算のプログミングをしているのですが 計算が合わなくて困っています。 整数型変数aと実数型変数bを定義 整数型変数cとdを定義して、c=0.5*a*b、d=a/2*b 実数型変数eとfを定義して、e=0.5*a*b、f=a/2*b という内容のプログラムを作ったのですが a=7,b=2.4を代入してみた結果 ---------------------------- Input a>>7 Input b>>2.4 8 7 8.400000 7.200000 ---------------------------- となりました どこが間違っているのでしょう? 答えは8.4でcが8なのは有効数字のためだと思いますが dとeで答えが全く違う理由が分かりません。 下に私が書いたものを貼っています。 ---------------------------- #include<stdio.h> int main(void){ int a,c,d; double b,e,f,ans; printf("Input a>>"); scanf("%d",&a); printf("Input b>>"); scanf("%lf",&b); c=0.5*a*b; printf("%d\n",c); d=a/2*b; printf("%d\n",d); e=0.5*a*b; printf("%lf\n",e); f=a/2*b; printf("%lf\n",f); return 0; } ---------------------------- よろしくお願いします。

  • C言語のプログラミングがうまくいきません!

    先日のプログラムを作り直しました。アドバイスのおかげでエラーは減りましたが、まだ完ぺきではないようです。恐らく、elseのところがいけないと思うのですが、どうしたらいいか分かりません。 ご指摘お願いします。 #include <stdio.h> #include <math.h> void main(void) { double x ,y ,z ,error ,menseki ; double ans; printf("x ?"); scanf("%lf", &x); printf("y ?"); scanf("%lf", &y); printf("z ?"); scanf("%lf", &z); if(x<y+z || y<x+z || z<x+y) { ans=(x+y+z)/2; menseki=sqrt(ans*(ans-x)*(ans-y)*(ans-z)); } if(x==y && y==z && z==x) { printf("正三角形です"); printf("面積は%lfです" , menseki); } else if(x==y || y==z || z==x) { printf("二等辺三角形です"); printf("面積は%lfです" , menseki); } else { printf("三角形です"); printf("面積は%lfです" , menseki); } else { printf("error"); } }

  • マクローリン展開について

    マクローリン展開について 以前あるサイトで質問したのですが、その回答がよくわからなかったのでこちらで質問します。 1/1-x についての級数展開の質問になります。 1/1-xをマクローリン展開すると、1+x+x^2+x^3+x^n+・・・・とないっていきますが、この時の収束がわかりません。 以前質問したときにこんな回答がありました。 f^(n)(x)=n!/(1-x)^n, f^(n)(0)=n! Sm(x)=Σ[n=0,m-1]f^(n)(0)x^n/n!=Σ[n=0,m-1]x^n (級数Σ[n=0,∞]x^nのm部分和) f(x)にマクローリンの定理を適用したときの剰余項をRm(x)とすると f(x)=Sm(x)+Rm(x) と表わせる。 |Rm(x)|=|Sm(x)-f(x)| =|Σ[n=0,m-1]f^(n)(0)x^n/n! -1/(1-x)| =|Σ[n=0,m-1] x^n - 1/(1-x)| =|(1-x^m) / (1-x) - 1/(1-x)| =|x^m/(1-x)|…☆ しかし、f^(n)(x)=n!/(1-x)^n, f^(n)(0)=n!というのが分かりません。 どこからこのような式はでてくるのでしょうか? また、剰余項というのは、級数は無限には実際計算できないわけで、例えばn=5とかで計算を終わらせる必要がありますが、 その時n=6以降の項は切り捨てることになります。 その切り捨てた項が剰余項となるのでしょうか? 余った項とかくので。 収束条件と剰余項がどういう関係があるのかはいまいちわかりませんが。

  • マクローリン展開 微分 問題

    マクローリン展開 微分 問題 aを正の定数、eを自然対数の底とし、f(x)=e^axとおく。 (1)自然数nに対して、f(x)のn次導関数を求めよ。 (2)f(x)のマクローリン展開を求めよ。 (3)Nを自然数とするとき、Σ[n=N~∞]((x^n)/(n-N)!)   の級数の和を求めよ。 (1) f´(x)=a・e^ax f´´(x)=a^2・e^ax よって、d^n/dx^n(f(x))=a^n・e^ax (2) e^axのマクローリン展開は、 e^ax=1+ax+(a^2/2!)x^2+(a^3/3!)x^3+・・・+(a^n/n!)x^n と解けました。答えは合っているでしょうか? (3)については、どのように解けばよいのか分かりません・・・ (3)の解き方を詳しく教えて頂けないでしょうか? ご回答、よろしくお願い致します。

  • C言語、ポインタについて。

    C言語初心者です。"やさしいC"などの入門書を呼んでいて「ポインタ」につまづきました。 別書を買ったり、サイトを見たりしたのですが、理解できませんでした。 "やさしいC"からの引用なのですが、 正: #include <stdio.h> int add(int *x1,int *x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(&n1,&n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int *x1, int *x2,int a){ *x1+=a; *x2+=a; } 誤: #include <stdio.h> int add(int x1,int x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(n1,n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int x1, int x2,int a){ x1+=a; x2+=a; } この2つの違いはなんでしょうか。 アドレスか、そうでないか、という違いはわかりますが、なぜ"誤"のコードだと正しく処理されないのかがわかりません。 教えてください、お願いします。 (「やさしいC」の回答より引用)

  • C++を使ってのテイラー展開

    C++を使って,sinとcosのテイラー展開をしたいのです。 プログラムを作ってはみたのですが,こんな感じでよろしいのでしょうか? #include<stdio.h> int main(void) {  int i,n;  double xb,x,sinx=0,cosx=0,hu;  xb=1.0;  hu=1.0;  printf("どこまで計算しますか?");  scanf("%d",&n);  printf("xはいくらですか?(1以下!)");  scanf("%lf",&x);  for(i=1;i<n;i++)  {  xb=xb*(x/i);  if(i%2==0)  { sinx=sinx+(hu*xb); hu=hu*(-1.0); }  else  { cosx=cosx+(hu*xb); hu=hu*(-1.0); }  }  if(i%2==0)  { printf("答え:%f\n",sinx); }  else  { printf("答え:%f\n",cosx); }  return 0; }

  • C言語なんですがうまくうごきません。

    X=1においてX^nをm回微分した値を求めるプログラムを作っているのですが、 何度も考えて訂正したりしてるのですが、どこが悪いのかわかりません 再帰関数を使ってます。 デバッグして調べてみてるのですが、うまくいってるようにみえるのですが、最後の値が0になります。 nを大きい値にすると、マイナスになったりするんです。 よくわかりません。 ちなみにnとmは正で、mは10までの数を入力します。 このプログラムの基本形を変えないで問題改善することはできるのでしょうか? わかる人いましたら教えてください。 #include <stdio.h> double differentiate(double n, int m); int main(void) { int a, b; printf("Input 2 number\n"); fflush(stdout); scanf("%d %d", &a, &b); printf( "a = %d\nb = %d\n", a, b ); printf("Answer = %d\n", differentiate(a, b)); return 0; } } double differentiate(double n, int m) { if(m == 1){ return n; }else{ return n * n-1 * differentiate(n-1, m-1); } }

  • C言語で連立一次方程式

    C言語で連立一次方程式 /* 連立一次方程式 a*x + b*y = e c*x + d*y = f の解を求めるプログラムを作成したい。 a,b,c,d,e,f をキーボード入力させる ことで、 行列 [a b c d] の逆行列、及び、連立方程式の解( x= , y= )を求めたい。 なお、a b c d の値によっては、逆行列を求めることが 出来ません。その時は、 【解を求めることはできません】 と表示してプログラムを終了するようにして下さい。 (注) [a,b,c,d,e,f]を 2次元配列 ma[2][3]とする. [逆行列[a,b,c,d]と解x,y]を 2次元配列 mb[2][3]とする. ma[][] の値をmain関数内でキーボード入力する mb[][] の値は,mat_keisan関数内で計算 mb[][] の値をmain関数内で表示 関数 mat_keisan の戻り値として,「解」が求まる方程式か どうかを知らせる「int 型のフラグ(旗)」として用いるとよい. */ #include<stdio.h> int mat_keisan(int ma , int mb); int main(void) { int inverse; double ma[2][3]; double mb[2][3]={0}; printf("連立一次方程式の計算\n"); printf("a * x + b * y= e\n"); printf("c * x + d * y= f\n"); printf("Input a :"); scanf("%lf",&ma[1][1]); printf("Input b :"); scanf("%lf",&ma[1][2]); printf("Input c :"); scanf("%lf",&ma[1][3]); printf("Input d :"); scanf("%lf",&ma[2][1]); printf("Input e :"); scanf("%lf",&ma[2][2]); printf("Input f :"); scanf("%lf",&ma[2][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[1][1],ma[1][2],ma[1][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[2][1],ma[2][2],ma[2][3]); inverse=mat_keisan(ma,mb); if(inverse==1) printf("計算できません\n"); else{ printf("逆行列\n"); printf("%4.2f %4.2f\n", mb[1][1],mb[1][2]); printf("%4.2f %4.2f\n", mb[2][1],mb[2][2]); printf("解\n"); printf("x=%4.2f\n",mb[1][3]); printf("y=%4.2f\n",mb[3][3]); } return (0); } /* 配列の足し算 */ int mat_keisan(int ma ,int mb ) { int x,y,z;// 1/ma[1][1]*mb[2][2]-ma[1][2]*mb[2][2]; //逆行列と解を求めるプログラムを作成する。 //そしてその値をmb[][] に入力する。 return(#######); } 関数内が手も足もでません; 他のサイトを調べてみたのですが逆行列を求めるプログラムがよくわかりません; >int mat_keisan(int ma ,int mb ) は、あってないかもです; それとinverseの意味がわかりません; ヒントや、解説を よろしくお願いします;。

専門家に質問してみよう