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

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

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

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

Q&A

解決済

1回答

536閲覧

2曲線の類似率を相関係数から求めたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/07/15 11:42

前提・実現したいこと

C言語を学習している者です。
sin波を合成すると振幅1の矩形波に近づくことが知られています。
イメージ説明
イメージ説明
イメージ説明
そこで、N個のsin波を合成したものと振幅1の矩形波との近似精度を相関係数で求めるプログラムを作成しました(以下)。
※範囲は0~1[s]で0.001[s]刻みのプロット値1000個をもとに相関係数を算出。
※Nは1~10, 100, 1000, 10000と実行するごとに変更する。
本来は、Nが大きくなるごとに、N個のsin波を合成したものは矩形波に近づく、つまり相関係数の絶対値は1に近づくのですが、次のような誤った結果が出てしまいます。

N 相関係数 1 0.901215 2 0.300397 3 0.180229 4 0.128725 5 0.100109 6 0.081896 7 0.069286 8 0.060037 9 0.052962 10 0.047376 100 0.003923 1000 0.901215 10000 0.901215

何が原因で誤った結果が出ているのか分からずに悩んでいます。
初心者なので分かりやすく教えて頂けると幸いです。

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

Nが大きくなるほど相関係数の大きさが1に近づくはずなのに、正しい結果がファイルに出力されない。 エラーは出ていない。

該当のソースコード

C

1#define _USE_MATH_DEFINES 2#define N 10000 //1~10, 100, 1000, 10000と実行するごとに変更 3#include<stdio.h> 4#include<math.h> 5void RectangularInput(double *y){ 6 int i; 7 y[0] = 0.0; 8 for(i=1; i<500; i++) y[i] = 1.0; 9 y[500] = 0.0; 10 for(i=501; i<1000; i++) y[i] = -1.0; 11} 12double Average(int len, double *a){ 13 double mean = 0.0; 14 for(int i=0; i<len; i++) mean += a[i]; 15 mean /= (double)len; 16 return mean; 17} 18double Correlation(int len, double *x, double *y){ 19 int i; 20 double xave = Average(len, x); 21 double yave = Average(len, y); 22 double sx=0.0, sy=0.0, sxy=0.0; 23 for(i=0; i<len; i++) sx += pow(x[i]-xave, 2); 24 sx = sqrt(sx); 25 for(i=0; i<len; i++) sy += pow(y[i]-yave, 2); 26 sy = sqrt(sy); 27 for(i=0; i<len; i++) sxy += (x[i]-xave) * (y[i]-yave); 28 return sxy/(sx*sy); 29} 30int main(){ 31 FILE *fp = fopen("20266005_accuracy.txt", "a+"); 32 int i, n, len=1000; 33 double x[1000], y[1000], t, f, a, delta=1.0e-3; 34 for(i=0; i<len; i++){ 35 t = (double)i*delta; 36 for(n=1; n<=N; n++){ 37 f = 2*n-1; 38 a = 4/(M_PI*(2*n-1)); 39 x[i] = a * sin(2.0*M_PI*f*t); 40 } 41 } 42 RectangularInput(y); 43 fprintf(fp, "%d %lf\n", N, Correlation(len, x, y)); 44 fclose(fp); 45 return 0; 46} 47

補足情報(FW/ツールのバージョンなど)

Visual Studio Codeを使用してコードを記述。
gccでコンパイル。

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

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

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

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

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

y_waiwai

2020/07/15 11:44

正しい結果、というのを提示しましょう
退会済みユーザー

退会済みユーザー

2020/07/15 12:08

申し訳ないのですが、正しい結果の正確な値はわかりません。ただ、自分の実行結果ではNが大きくなるほど相関係数が1に近づいていないので、誤っていると判断しました。それを踏まえて、Nが大きくなるほど相関係数が1に近づくように結果が出ればそれを正しい結果として扱えると思ったので、質問致しました。
guest

回答1

0

ベストアンサー

for(n=1; n<=N; n++){ f = 2*n-1; a = 4/(M_PI*(2*n-1)); x[i] = a * sin(2.0*M_PI*f*t); }

ここ、サイン波の合成になってます?
x[i] に N個のサイン波が積算されてます?

投稿2020/07/15 12:20

編集2020/07/15 12:20
episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2020/07/15 12:24

回答有り難うございます。 本当ですね。x[i] += a*sin(2.0*M_PI*f*t)でないと合成されませんね。 気づかせて頂いて有り難うございます。 これで正しい値が出るか試してみて、それでもダメだった場合はコメントを添えます。
episteme

2020/07/15 12:27 編集

くわえて配列はあらかじめ0初期化しておくことをオススメします。 # 積算に先立って x[i] = 0.0 するだけですが。
episteme

2020/07/15 12:31

t = 0.0 および 0.5 の付近では サイン波の合成はすっごく暴れる(プロットしてみりゃわかります)から、 期待通りの結果が得られるか心配ではありますが。
退会済みユーザー

退会済みユーザー

2020/07/15 12:31

修正したのですが、N=1の時、相関係数が-1.#QNAN0と表示されてしまいました。この意味と対処法はありますか?
episteme

2020/07/15 12:34

相関求めるときに0で割るよなことしてません?
退会済みユーザー

退会済みユーザー

2020/07/15 12:40

x[i]=0.0を忘れていました。すみません。 修正後、次のような結果になりました。 1 0.901215 2 0.949962 3 0.966907 4 0.975438 5 0.980562 10 0.990789 100 0.999717 1000 0.999992 10000 1.000000 相関係数はNが大きくなるごとに1に近づいていますが、N=1でも相関係数が1にそこそこ近いです。 これは正しいのでしょうか?直感的にはN=1のときのグラフと矩形波が0.9もの相関があるようには思えないのですが。。。
episteme

2020/07/15 12:47

正しいか否かの判断は僕にはできません。
退会済みユーザー

退会済みユーザー

2020/07/15 12:50

そうですよね、申し訳ありません。 ともかく、Nが大きいほど相関係数が1に近づいたので良かったです。 本当に有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問