質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1647閲覧

sinxのテイラー展開について

tocchi

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/06/14 13:06

編集2018/06/15 22:37

学校で課題が出ました。
関数y=sin(x)のテイラー展開で、n番目の値が1*10^-8よりも小さくなるまでの級数を求め、任意のxに対するsin(x)を近似して求めよ。というのをc言語でやれというものです。
考えてみたのですが全く分かりませんでした。
教えていただけないでしょうか。
式はsinx = ・・・+(-1)^n /(2n + 1)! *x^2n+1 +・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/14 14:15

「n番目の値が1*10^-8よりも小さくなるまでの級数を求め」と書いてありますがsin(x)のテイラー展開は符号が交互に入れ替わるので「n番目の値の絶対値」ではないでしょうか?
guest

回答3

0

「任意のx」に対しては普通は無理です。

テイラー展開は特定の点近傍でしか有効ではありません。基準点を動かしたら式の作り直しが必要です。

まあ、周期関数なので一周範囲内での誤差が指定値よりも小さくできるならばシフトして対応するという強引な方法もありますが綺麗ではないです。

投稿2018/06/14 14:15

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

まず、n番目の項を求める式を確認しましょう。
次に、それをC言語のコードにしましょう。
そして、1から、n番目の項まで加算する C言語のコードを作成しましょう。

まずは、そこからです。
そして、指定の値 (1*10^-8)より、小さい値となるnの値を求め、その前(この場合、n-1 となる)まで、加算するようにすれば、良いと思いますが、どうでしょうか?

うまくいかなくでも、まず、コードを作成し、動かしてから、次の質問を。

投稿2018/06/14 13:54

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは、順を追って説明します。

1.テイラー展開したときのn番目の係数を求める。

まずsin(x)のテイラー展開なのでnが偶数の時は0です。よって奇数の時だけ考えます。
係数は {(-1) ^ ((n - 1) / 2)} / n! なのでこれをコードに落とし込みます。
ここで重要なのはn!を直接求めないことです。n!を求めると莫大な数値になり、計算に時間がかかったり
オーバーフローします。for文を使って2~nまでで割ってあげましょう。
そして、忘れてはいけない符号です。pow関数を用いて最後にかけてあげましょう。

C

1double a_n(int n) 2{ 3 double answer = 1.0; 4 int i; 5 6 for(i = 2; i <= n; i++){ 7 answer /= (double)i; 8 } 9 answer *= pow(-1,(n - 1) / 2); 10 return answer; 11}

2.1を用いて和を求める。
while文を用いて和を求めてあげます。修正依頼のところでも書きましたが、n番目の値の絶対値が
1.0 * 10 ^ (-8)より小さくなるまで足してあげます。1でも述べましたが、奇数の時だけを考えればいいので それを考慮してコードは以下のようになります。

C

1double my_sin(double x) 2{ 3 int i = 1; 4 double answer = x; 5 6 while(fabs(a_n(2 * i + 1)) >= pow(10,-8)){ 7 answer += a_n(2 * i + 1) * pow(x,2 * i + 1); 8 i++; 9 } 10 return answer; 11}

3.実際にxに角度を入れて求める。
自分で実装した関数が正しく動いているか確認するため標準ライブラリーにあるsin(x)と比較しました。

C

1int main(void) 2{ 3 double data[7] = {1 / 6.0,1 / 4.0, 1 / 3.0, 1 / 2.0, 2 / 3.0, 3 / 4.0,1.0}; 4 int i; 5 for(i = 0; i < 7; i++){ 6 printf("%f %f %f\n",data[i],sin(M_PI * data[i]),my_sin(M_PI * data[i])); 7 } 8 return 0; 9}

投稿2018/06/14 14:31

編集2018/06/14 14:32
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問