• ベストアンサー

C言語 正弦関数の級数展開のプログラム

sinxの級数展開を7項まで取った場合と組み込み関数で求めたsinxの値の差を,0度から360度まで,プログラムを作成して求めよ、という問題がわかりません。 どなたか、わかる方がいまいたら、教えてください。

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

pow(x,3/p1) ではなくて pow(x,3)/p1 ですね

girugiru
質問者

お礼

ありがとうございました。 エラーなく動作しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.9

階乗の計算に int 型を使っているので オーバーフローしています。 float の有効桁数は 7桁です。double でも 15桁。 他は見ていませんが、単純に級数展開の式を使うとどんどん精度が落ちていきます。 誤差が拡大しないように計算式を工夫しましょう。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.8

> 7項で終わる場合は終了条件を k <= 7 にすればよいでしょう k > 7 ではありませんか?

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.7

ちょっと実行してみましたがこれは p6=kaijyo(13); でオーバーフローしてますね。 昔作ったプログラムがあったので参考にどうぞ double mysin(double x) { double EPS = 1e-08; /* 項の値がこれより小さくなったらループ終了 */ double s = 0.0; /* 求める sin 値 */ int k; /* 項数 */ int n; /* 級数(1, 3, 5, 7, ...) */ int sign = 1; /* 加算か減算かのための変数。1項ごとに符号が反転 */ double diff; /* 項の値 (x^n/n!)*sign */ int i; /* ループ用の変数 */ k = 1; for (; ;) { n = 2 * k - 1; diff = 1.0; /* x^n / n! */ for (i = 1; i <= n; i++) { diff *= x / i; } if(diff < EPS) { break; } /* + or - */ diff *= sign; s += diff; k++; sign *= -1; } return s; } 7項で終わる場合は終了条件を k <= 7 にすればよいでしょう

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

> p1=kaijyo(3); > p2=kaijyo(5); > p3=kaijyo(7); > p4=kaijyo(9); > p5=kaijyo(11); > p6=kaijyo(13); ループの中で毎回これらを計算するのは効率が悪いです。 それから、13の階乗はint型で扱える範囲を超えてしまうため、 p6の値は正しくありません。 ロジックを見直す方がよいと思います。

girugiru
質問者

補足

回答ありがとうございます。 double kaijyo(double k) { double seki,i; seki=1; for(i=1;i<=k;i++){ seki*=i; } return(seki); } と直しました。 int sum(int a,int b) { int ans; ans=a+b; return ans; } main() { z=sum(a,b); } のように項数と角度を渡すと値を返すような関数を作成したいのですが、項数と角度の渡し方(上記でいうz=sum(a,b))をどのように変えればいいかわかりません。ヒントでもいいので教えてください。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

級数展開部分のプログラムを見せてもらえませんか おそらく角度がラジアンになっていないのではないでしょうか 組み込み関数は #include <math.h> で使えるようになる double sin(double x) のことです。 この関数の値と自作関数(例えばmysin( ))の値の差を求めよということなので mysin(x) - sin(x)の値をプリントすればよいでしょう

girugiru
質問者

補足

#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<math.h> main() { int kaijyo(int k); int i,p1,p2,p3,p4,p5,p6; float deg,z,a,x; float pi=3.1415926535897932384626433832795; for(i=0;i<=360;i+=5){ p1=kaijyo(3); p2=kaijyo(5); p3=kaijyo(7); p4=kaijyo(9); p5=kaijyo(11); p6=kaijyo(13); x=pi*i/180; z=x-pow(x,3/p1)+pow(x,5/p2)-pow(x,7/p3)+pow(x,9/p4)-pow(x,11/p5)+pow(x,13/p6); printf("%d,%f\n",i,z); } getch(); exit(0); } int kaijyo(int k) { int seki,i; seki=1; for(i=1;i<=k;i++){ seki*=i; } return(seki); } 実行結果の前にpow: DOMAIN errorとなっているので、powの使い方が間違っているのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

1. sin xの級数展開がわからない 2. 7項まで取った場合がわからない 3. 組み込み関数がわからない 4. 値の差を求めるのがわからない 5. 0度から360度までがわからない 6. プログラムの作成がわからない なにがわからないのでしょうか。 ここでは問題の丸投げはだめです。 自分である程度プログラムを書いてそれを書き込むと回答率が上がります。

girugiru
質問者

補足

回答ありがとうございます。 とりあえずsinxの級数展開部分のプログラムを作ってみたのですが、電卓でsinxを計算した場合と0から90°はほぼ等しいのですが、90から180の値は減少せずに増加し、180から360°はマイナスの値が出てこず、電卓の値と全く違ってわかりません。 3と4もわかりません。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

プログラムを書く前の話として、 「sinxの級数展開を7項まで取った場合」は おわかりですね?

girugiru
質問者

補足

回答ありがとうございます。 「sinxの級数展開を7項まで取った場合」は x-x^3/3!+x^5/5!-x^7/7!+x^9/9!-x^11/11!+x^13/13!です。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>どなたか、わかる方がいまいたら、教えてください。 常套句ですが、わかる人を探すより前に girugiru さんが何がわからないかを補足しなければいけません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 正弦関数の級数展開

    はじめまして。 sinxの級数展開を7項まで取った場合と組み込み関数で求めたsinxの値の差を,0度から360度まで,プログラムを作成して求めよ、という問題があるのですが、300度まででとまってしまいます。 どなたか、わかる方がいまいたら、教えてください。 以下リストです。 #include <stdio.h> #include<conio.h> #include <math.h> const double pi=atan(1.0)*4; double kaijyo(int n) { double ret=1; for (int i=2;i<=n;i++) { ret*=i; } return ret; } double polSin(double theta,int order) { int i; double ret=theta; for (i=1;i<order;i++) { if (i%2==1) { ret-=pow(theta,(i*2+1))/kaijyo(i*2+1); } else { ret+=pow(theta,(i*2+1))/kaijyo(i*2+1); } } return ret; } int main() { int order=7; double rad,theta,trueVal,polVal; for (theta=0;theta<360;theta+=1.0) { rad=theta/180*pi; trueVal=sin(rad); polVal=polSin(rad,order); printf("%e\n",polVal-trueVal); } getch(); return 0; }

  • 数学のフーリエ級数展開およびデルタ関数の問題です!

    数学のフーリエ級数展開、およびデルタ関数の問題です!助けて下さい(><;) (1) f(x)=e^x (0≦x≦π) をフーリエ・サイン級数に展開せよ。 (2) f(x) (-π<x<π) のフーリエ級数展開に対して、パーセバルの等式 (1/π)∫[-π,π]|f(x)|^2・dx=(a0^2/2)+Σ[n=1,∞](an^2+bn^2)が成り立つことを利用して Σ[n=1,∞](1-(-1)^n・e^π)^2・n^2/(n^2+1)^2の値を求めよ。 (3)デルタ関数δ(x)に対して∫[-π/2,π/2]δ(sinx)cosxdxの値を求めよ。 以上の3問です。本当に困っています(;_;) 途中計算などは出来る限り詳しく書いてもらえると助かります。 これでは読みにくいと思われるので問題の写真を貼っておきます。 http://book.geocities.jp/yukarin6127/f_kyusu.htm よろしくお願い致しますm(_)m

  • Fortranでベッセル関数のべき級数展開が正しく計算できない!!!

    Fortranでベッセル関数のべき級数展開が正しく計算できない!!! タイトルの通りです。ベッセル関数のべき級数展開は画像に添付した通りです。 この計算をFortranで行っているのですが、式中のzが30以上になると、正しく 計算できません。zが30以下のときは、ベッセル関数の値と完全に一致しています。 どうも、(z/2)^2nの項が大きくなりすぎることが原因です。 これの解決法をどなたかご存知ですか? もしご存知でしたらご教授願います。 ちなみに∞はn=100までで計算をしています。 ほんと死にそうです。。。助けて下さい。

  • フーリエ級数展開。

    f(x)=0(-π≦x<π),x(0≦x<π) これをフーリエ級数展開するとどうなるのでしょうか? フーリエ級数展開した式が出ません・・・。 答えとしては f(x)=π/4-(2/π)cosx+sinx-sin2x/2-(2/π)cos3x/3~2+sin3x/3-・・・ と解答にはありますが、一般系(?)で表記したいと考えています。 どのようにフーリエ級数展開すればいいのでしょうか? お願いします。

  • フーリエ級数展開について

    次の関数のフーリエ級数展開を行え。 xsinx って問題なんですが、解けません>< 教えてください。

  • 級数展開 剰余項 計算(評価)

    級数展開 剰余項 計算(評価) e^xの巾級数展開について、 剰余項R(n+1)がlim[n→∞]R(n+1) = 0になれば、 e^x=Σ[n=0~∞]((x^n)/(n!))と表せることは理解できました。 Rの係数?は実際(1/((n+1)!))となるからe^xは巾級数展開可能 であると理解したのですが、e^xの場合lim[n→∞]R(n+1) は具体的に どのように計算(評価)されるのでしょうか? また、剰余項に関して、 R(n+1)やR(x^(n+1))などと表記されるようですが、なにか 違いはありますか? それぞれの表現について教えて頂けないでしょうか? また、C^ω級は級数展開可能である関数を表す場合に用いられると 理解したのですが、C^ω級は無限級数展開でも有限級数展開 (有限級数展開の例が思いつきませんが・・・)でもどちらでも 使用して良いのでしょうか? また、C^ω級はテーラー展開の場合(x=0で級数展開できない場合)でも 使用して良いのでしょうか? ご回答よろしくお願い致します。

  • フーリエ級数展開についてです。 急いでます。

    (1)下の図のような周期2の関数がある。これをf(t)=|t| (-1<t<1)とし、そのフーリエ級数展開を求めなさい。なお、フーリエ級数展開はフーリエ係数を求めそれらの係数を用いて与式を展開すること。          |        /\ |   /\ _\/__\|/__\/___      -1       1   (2) 上の結果を用いて、Σ 1/(2n-1)^2=(π^2)/8となることを導きなさい。          (n=1~∞) という問題を教えてください。

  • f=max(sinx,0)のフーリエ級数展開について

    f=max(sinx,0)は     f(x)=  0 (-π≦x≦0)       sinx (0≦x≦π)  であり、 この関数のフーリエ級数展開をせよという問題ですが、n≧2として 係数ao=2/π,a1=0、an= {(-1)^(n+1) -1} / {π*(n^2 -1)} になり、b1=1/2,bn=0となったので、 f(x)=1/π + 1/2sinx +  Σ(n=2~∞)an*cosnx と答えを得ましたが、かなり自信がありません。どなたか知恵のある方、貸してくれるとありがたいです。 もちろんfは2π周期の周期関数で、区分的に滑らかである。

  • C言語

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

  • フーリエ級数展開は三角関数ですがほかの関数は可能?

    フーリエ級数展開は三角関数で展開する方法ですが、 矩形波や三角波などを基底関数にして展開できますか? たぶん発散しそうな気がしますが。 周期関数を三角関数以外の関数で展開する方法があったら紹介してください。