sinのマクローリン展開

解決済みの質問

sinのマクローリン展開

再帰的関数定義とsin(x)のマクローリン展開の初めの10項を用いてsin(x)の近似値を出力するプログラムを作成せよ。
という問題で、マクローリン展開は分るのですがプログラムに出来ません…。
関数まで習っていて、配列などはまだ習っていないのですが、
どうやれば良いのかどなたか教えてください_| ̄|○

投稿日時 - 2006-05-25 23:19:12

QNo.2175323

すぐに回答ほしいです

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

あくまで一例です。XXXXの部分が再帰呼び出しをする箇所です。
考えてみて下さい。

/* 第n項まで展開して sin(x) を求める */
dboule sin(double x, int n) {
  
  if ( n == 1 ) {
    return x;
  if (n%2 == 1) {
    return XXXX;
  } else {
    /* n%2 == 0 */
    return XXXX;
  }

}

投稿日時 - 2006-05-27 03:10:22

補足

最後のXXXXは0ですよね?
最初のXXXXは、
(pow(x,n)/(n * sin(n-1)))
ですか??
n=1から、4項おきに-になると思うんですが、それがうまく表現できません(>_<)

投稿日時 - 2006-05-27 13:00:37

ANo.4

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

[  前へ  |  次へ ]

ベストアンサー以外の回答(4件中 1~4件目)

ANo.5

残念ですが、2つとも不正解ですね。
main関数の最後が、、
printf("sin_10=%10.9f\n", sin(x,10));
だとしたら、これでは正しい答えは出力されませんよね?

この sin 関数はそういう使い方を想定しています。

投稿日時 - 2006-05-27 15:01:08

お礼

1つですることはどうしても出来なかったので、2つにしてみました!

double f(int n, int i, double x)
{
if (n<=1){
return (1);}
else{
return (1 - x * x / i / (i+1) * f(n-1, i+2, x));}
}
double sinx(int n, double x)
{
return f(n, 2, x) * x;
}

printf("sin_10=%10.9f\n", sin(x,10));

printf("sin_10=%10.9f\n", sin(n,x));
ですねっ(>_<)

ありがとうございました!!

投稿日時 - 2006-05-28 12:25:04

ANo.3

再帰呼び出し、マクローリン展開以前に・・・
提示されたプログラムにはおかしなところがたくさんあります。
コンパイル通ったのでしょうか?
1.main 内の変数 i が初期化されていません。
2.main 内の変数 n を初期化されていますが、以後使われていません。
3.main 内からsin関数を呼び出していますが、この結果が使われていません。
4.sin関数の中からsin関数を呼び出していますが、引数の数が不一致です。

ただわからない、わからない、といわれてもどのへんがどうのようにわからないのか説明しないと、他の方も答えられないと思いますよ。

投稿日時 - 2006-05-27 01:21:45

補足

#include<stdio.h>
main()
{
int i,n;
double xb,x,sinx=0,hu;

xb=1.0;
hu=1.0;
n=10;

printf("x(rad)=");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);
}}
if(i%2==0){
printf("sin_10=%10.9f\n",sinx); }
return 0;
}

失礼しました(>_<)
これが、再帰を使わない表現ですよね?
『階乗』を求めるようなものを再帰で表現するのは理解できるのですが、
上のようなものはどこをどう再帰にすれば良いのか良く分からないんです。。

投稿日時 - 2006-05-27 01:50:20

ANo.2

http://okwave.jp/kotaeru.php3?qid=1629031
とか
http://okwave.jp/kotaeru.php3?qid=1035726
あたりが参考になるんじゃないでしょうか

投稿日時 - 2006-05-26 02:48:50

補足

ありがとうございます!
しかし、やはり再帰となると良くわかりません。

もう、めちゃくちゃです…

#include<stdio.h>
double sin(double xb, double x, int i);


main()
{
int i,n;
double xb,x,sinx=0,hu;

xb=1.0;
hu=1.0;
n=10;

printf("x(rad)=");scanf("%lf",&x);
sin(xb,x,i)
if(i%2!=0){
sinx=sinx+(hu*xb); hu=hu*(-1.0);
}
if(i%2==0){
printf("sin_10=%10.9f\n",sinx); }
return 0;
}

double sin(double xb, double x, int i)
{
xb=1.0;
return (xb * sin(xb));
}

投稿日時 - 2006-05-27 00:43:29

ANo.1

宿題なら、自分で解きましょう。
わからなければ、出題者に質問しましょう。

再帰的に解くなら、配列は必要ありません。(そこに再帰的解法の価値がある)

投稿日時 - 2006-05-25 23:26:59

補足

すみません!!
でも、もう締め切りは過ぎてしまったので(笑)

再帰の説明はもう2度も受けたのですが、まだ理解できないんです。。

投稿日時 - 2006-05-27 00:44:48

あわせてチェックしたい
  • マクローリン展開 ...
  • マクローリン展開 ...
  • マクローリン展開と複素積分 ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら