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

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

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

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

Q&A

解決済

3回答

2653閲覧

複数のsin波から矩形波を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/07/11 01:34

編集2020/07/11 02:05

前提・実現したいこと

C言語を学習している者です。
矩形波1周期分(t=0~1[s])を1/1000[s]刻みでプロットするプログラムを作成して、時刻とその時の変位をファイルに書き込むのが目標です。
次の式のようにN個のsin波(今回は10個)を足し合わせると、振幅1の矩形波ができると学習したのですが、以下のソースコードでは何故か振幅が1になりません。
イメージ説明
イメージ説明
イメージ説明
自分のソースコードのどの部分が原因なのか全く分からないので、ミスを犯している箇所を教えて頂きたいです。
些細なヒントでも良いので、アドバイスを下さい。
宜しくお願い致します。

※追記
f=10とタイプミスしていたのでf=2*n-1と修正しました。

発生している問題・エラーメッセージ

矩形波の振幅が1にならない。(失敗の実行結果は以下)
エラーは出ていない。

該当のソースコード

C

1#define _USE_MATH_DEFINES 2#define N 10 3#include<stdio.h> 4#include<math.h> 5 6void Save(int i, double t, double x, FILE *fp){ 7 double sinarray[1000][2]; 8 sinarray[i][0] = t; 9 sinarray[i][1] = x; 10 fprintf(fp, "%lf %lf\n", sinarray[i][0], sinarray[i][1]); 11 return; 12} 13 14int main(){ 15 FILE *fp; 16 fp = fopen("20266005_rectangularwave.txt", "a+"); 17 int i, n, len=1000; 18 double x, t, f=2.0*n-1, a=4.0/(M_PI*(2.0*n-1)), delta=1.0e-3; 19 for(i=0; i<len; i++){ 20 x = 0.0; 21 t = (double)i*delta; 22 for(n=1; n<=N; n++){ 23 x += a * sin(2.0*M_PI*f*t); 24 } 25 Save(i, t, x, fp); 26 } 27 fclose(fp); 28 return 0; 29} 30

失敗の実行結果の一部

全て載せると10000字を超えるため、一部を載せます。これ以降は同様に繰り返されます。

0.000000 0.000000 0.001000 0.000002 0.002000 0.000002 0.003000 -0.000001 0.004000 -0.000002 0.005000 -0.000001 0.006000 0.000001 0.007000 0.000002 0.008000 0.000001 0.009000 -0.000002 0.010000 -0.000002 0.011000 0.000000 0.012000 0.000002 0.013000 0.000002 0.014000 -0.000001 0.015000 -0.000002 0.016000 -0.000001 0.017000 0.000002 0.018000 0.000002 0.019000 0.000000 0.020000 -0.000002 0.021000 -0.000002 0.022000 0.000000 0.023000 0.000002 0.024000 0.000001 0.025000 -0.000001 0.026000 -0.000002 0.027000 -0.000001 0.028000 0.000002 0.029000 0.000002 0.030000 0.000000 0.031000 -0.000002 0.032000 -0.000002 0.033000 0.000001 0.034000 0.000002 0.035000 0.000001 0.036000 -0.000001 0.037000 -0.000002 0.038000 -0.000001 0.039000 0.000002 0.040000 0.000002 0.041000 -0.000000 0.042000 -0.000002 0.043000 -0.000002 0.044000 0.000001 0.045000 0.000002 0.046000 0.000001 0.047000 -0.000001 0.048000 -0.000002 0.049000 -0.000000 0.050000 0.000002 0.051000 0.000002 0.052000 -0.000000 0.053000 -0.000002 0.054000 -0.000002 0.055000 0.000001 0.056000 0.000002 0.057000 0.000001 0.058000 -0.000002 0.059000 -0.000002 0.060000 -0.000000 0.061000 0.000002 0.062000 0.000002 0.063000 -0.000000 0.064000 -0.000002 0.065000 -0.000001 0.066000 0.000001 0.067000 0.000002 0.068000 0.000001 0.069000 -0.000002 0.070000 -0.000002 0.071000 -0.000000 0.072000 0.000002 0.073000 0.000002 0.074000 -0.000001 0.075000 -0.000002 0.076000 -0.000001 0.077000 0.000001 0.078000 0.000002 0.079000 0.000001 0.080000 -0.000002 0.081000 -0.000002 0.082000 0.000000 0.083000 0.000002 0.084000 0.000002 0.085000 -0.000001 0.086000 -0.000002 0.087000 -0.000001 0.088000 0.000001 0.089000 0.000002 0.090000 0.000000 0.091000 -0.000002 0.092000 -0.000002 0.093000 0.000000 0.094000 0.000002 0.095000 0.000002 0.096000 -0.000001 0.097000 -0.000002 0.098000 -0.000001 0.099000 0.000002 0.100000 0.000002 0.101000 0.000000 0.102000 -0.000002 0.103000 -0.000002 0.104000 0.000000 0.105000 0.000002 0.106000 0.000001 0.107000 -0.000001 0.108000 -0.000002 0.109000 -0.000001 0.110000 0.000002 0.111000 0.000002 0.112000 0.000000

###利用環境
Visual Studio Codeで実行。

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

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

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

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

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

guest

回答3

0

ベストアンサー

anもfnも総和記号シグマの中にあるので、当然、nごとに計算しなければなりません。つまり、nのforループ内で計算しなければなりません。

C

1 for(n=1; n<=N; n++){ 2 f = 2.0 * n - 1.0; 3 a = 4.0 / (M_PI * (2.0 * n - 1.0)); 4 x += a * sin(2.0*M_PI*f*t); 5 }

fとaの値は、nが同じなら、tに依らず同じ値なので、あらかじめ計算して配列に入れておけば速いですが、この計算回数なら違いはわからないと思います。

投稿2020/07/11 02:52

Bearded-Ockham

総合スコア430

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

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

退会済みユーザー

退会済みユーザー

2020/07/11 03:18

回答有り難うございます。 勉強して計算時間も考えられる人間になります。 アドバイス有り難うございました。
guest

0

a_nとf_nが正しく計算されていません。
内側のforの中でnが変わるごとに変化させる必要があります。

投稿2020/07/11 02:13

Kaleidoscope

総合スコア257

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

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

退会済みユーザー

退会済みユーザー

2020/07/11 02:21

回答有り難うございます。 for文の外でf=2*n-1と定義しているのですが、内側のfor文(n=1~N)ではnの値が変わらないのでしょうか?
Kaleidoscope

2020/07/11 03:04

プログラムの流れは基本上から下に1行ずつ実行されていきます。 double x, t, f=2.0*n-1, a=4.0/(M_PI*(2.0*n-1)), delta=1.0e-3; の行が1度実行されたあとは次の行に向かうだけで、繰り返されることはありません。 for文は「その中のプログラムを指定回数繰り返す」という指示文です。 for文の外に何を書いても実行される事はありません。(forの中から呼び出されない限りは)
退会済みユーザー

退会済みユーザー

2020/07/11 03:07

有り難うございます。 確かにfor文の中でないと変わらないですね。 勉強になりました。
guest

0

faが固定値になってます。

投稿2020/07/11 02:01

ozwk

総合スコア13521

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

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

退会済みユーザー

退会済みユーザー

2020/07/11 02:07

申し訳ありません。 質問編集時にだけf=10とタイプミスしていました。 正確にはf=2*n-1でプログラムを動作させました。
ozwk

2020/07/11 02:30

> for文の外でf=2*n-1と定義しているのですが、内側のfor文(n=1~N)ではnの値が変わらないのでしょうか? その理屈で言ったら t = (double)i*delta だってforの外側でいいですよね? でも違いますよね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問