みんなの「教えて(疑問・質問)」にみんなで「答える」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・・・とかになってしまいます
どうすればいいでしょうか?
分かる方、お願いします。

投稿日時 - 2015-05-28 21:13:55

QNo.8984094

すぐに回答ほしいです

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

こんな感じ?
以下変更点
・関数kaiを追加。階乗を計算。
・変数mを追加。(2 * n + 1)を計算した結果を入れる
・変数sを追加。符号を表現する。
その他ちょこちょこ変わってます。

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

double kai(int n)
{
double k = 1.0;
while(n > 1)
{
k *= n;
n--;
}
return k;
}

int main(void)
{
int i, n, m;
double x, kotae, tmp, s;

printf("n=? \n");
scanf("%d",&n);
printf("x=? \n");
scanf("%lf",&x);

kotae = 0.0;
for(i = 0 ; i < n ; i++)
{
m = (2 * i + 1);
s = ((i % 2) == 0) ? 1.0 : -1.0;
tmp = s * pow(x, m) / kai(m);
kotae += tmp;
}
printf("sin%fの値は%lf\n", x, sin(x));
printf("sin%fのテイラー展開第%d項までの和は%f \n" ,x ,n ,kotae);
return 0;
}

投稿日時 - 2015-05-29 16:24:56

お礼

有難うございます。
おかげで助かりました

投稿日時 - 2015-06-09 18:00:56

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>どうすればいいでしょうか?

手動デバッグのやり方と数列の基本を身につけてください。

n=0,x=2のとき

forループ終了時、
tmp=1 , kotae=2
この時点でtmp=1が間違いであることに気付く必要がある。

tmp=x;
に修正して

n=1,x=2のとき

forループ終了時、
tmp=x=2 , kotae=2
この時点で、for文のn=1かi<nの間違いに気付く必要がある。
修正して

forループ終了時、
tmp=-x^3/(2*3) , kotae= ...

目の前に実行環境があるなら、手動デバッグでなくて、tmpも表示したり、for文の中で逐次表示すればよい。

数列でn=0やn=1を代入して確認するのは基本中の基本。
大学生なら、高校数学を復習した方がいい。

投稿日時 - 2015-05-29 12:01:44

お礼

有難うございます。
助かりました

投稿日時 - 2015-06-09 17:59:59

ANo.1

tmp=1; // ここ違うんじゃないかい?
tmp=x; // こうじゃね

投稿日時 - 2015-05-28 23:08:23

お礼

助かりました。

投稿日時 - 2015-06-09 17:59:25