• 締切済み

C言語

C言語による課題です.指数関数のマクローリン展開について,第n項までの近似値を求めるプログラムを作成し,各ステップごとに理論値との誤差を比較しなさい.(xとnは任意の値で自分で入力する.) 宜しくお願いします.

みんなの回答

  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.2

プログラムが正常に動作するかどうかは、 実際にコンパイルして実行すればある程度分かります。 質問者さんは現在、C言語のプログラムをコンパイルできない状態なのでしょうか (学校のPCにはCコンパイラがあるが、自宅のPCにCコンパイラが無い等。)? そういう前提で話を進めていきます。 プログラムの方ですが、コンパイルしようとするとエラーが出ます。 コンパイラエラーが出るのは次の箇所です。 >    printf("x="); 全角スペースがあるので、消して下さい。 > for(i=1;i<=n;i=++){ 『i=++』ではなく、『i++』です。 エラーではないですが、以下の点が気になります。 > int n; > double x=1.0,y=1.0,e=1.0,err; > > int i; > double f=1.0,p=1.0; n, x, i, errは良いんですが、yとeとfとpは一体何を表す変数ですか? 最後のprintf関数の内容から察するに、eが理論値でyが近似値でしょうか? > printf("Mclaurin展開による&d次までのexp(%e)の理論値,近似値,誤差"); &d(正しくは%dでしょうか?)と%eは何を表示するのでしょうか? 表示させる変数が書いてありません。 > printf("%12.8e %12.8e\n %12.8e\n",e,y,err); 前の行のprintfで改行していないため、表示させた時に見辛くなります。 次に数学的な話です。 exp(x)のマクローリン展開は 1 + {1/(1!)}x + {1/(2!)}(x^2) + {1/(3!)}(x^3) + … + {1/(n!)}(x^n) ですよね。 質問者さんのプログラムには、階乗(2!や3!など)を計算する部分と、 xのべき乗(x^2やx^3など)を計算する部分がありません。 また、足し算をしていません。 試しに > for(i=1;i<=n;i=++){ > > f=(double)i; > p=x; > y=p/f; > e=exp(x); > err=e-y; > } の部分の動作を紙に書いて確認してみてください。 xやnに適当な数字を代入し、プログラムに書いた通りの方法で計算して動作確認するんです。 例えばx = 4, n = 3ならマクローリン展開の式は 1 + {1/(1!)}・4 + {1/(2!)}・(4^2) + {1/(3!)}・(4^3)です。 このforループの部分はx = 4, n = 3を代入した時に、 (1) 1!や2!や3!を計算するか (2) 4^2や4^3を計算するか (3) 1と{1/(1!)}・4と{1/(2!)}・(4^2)と{1/(3!)}・(4^3)を足しているか (4) 最終的に、変数yに1 + {1/(1!)}・4 + {1/(2!)}・(4^2) + {1/(3!)}・(4^3)の値が格納されるのか といった点を見て下さい。

xmasu
質問者

お礼

ありがとうございます。 何とか完成しました。

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

ここは課題を丸投げしていい場所でないことは当然知っていますよね? どこまでわかっていてどこからがわからないのか, きちんと書いてください.

xmasu
質問者

補足

まず,課題を丸投げしてしまったことをお詫びさせていただきます.すいませんでした. プログラムを書いてみました.間違いがあったらご指摘していただけたら幸甚です. ------------------------------------- #include <stdio.h> #include <math.h> int main(void) { int n; double x=1.0,y=1.0,e=1.0,err; int i; double f=1.0,p=1.0;    printf("x="); scanf("%lf",&x); printf("n="); scanf("%d",&n); for(i=1;i<=n;i=++){ f=(double)i; p=x; y=p/f; e=exp(x); err=e-y; } printf("Mclaurin展開による&d次までのexp(%e)の理論値,近似値,誤差"); printf("%12.8e %12.8e\n %12.8e\n",e,y,err); return 0; }