• 締切済み

関数の仮引数・実引数、またプログラムの計算についての正誤

漸化式で計算を求めるプログラムを作成したいのですがわからないところが出てしまったのでご教授のほうお願いします。 levin()関数の中で漸化式の計算を行っているのですが、その関数の中身の●の部分をどう表現したらいいのかわかりません。仮引数や実引数をどのように設定するか、もう一つはこのプログラムで漸化式の『alpha』を求めることができるのか、また間違っているなら指摘していただけるとありがたいです。プログラムはめちゃくちゃだと思いますがよろしくお願いします。 #include<stdio.h> #define SIZE 100 #define M 1 double levin(●, ●); int main(){ double a[SIZE]; double r[SIZE]; double alpha; int i; int m; a[0] = a[1] = 0.0; m = 0; alpha = r[0]; for(i = 0; i < M; i++){ levin(●, ●); } return 0; } double levin(●, ●){ int m = 50; int k; double beta = 0.0; double km; double a[SIZE]; double r[SIZE]; double new_a[SIZE]; double alpha; for(k = 0; k <= m; k++){ beta += ((a[k] * (r[m + 1 - k])); } km = - (beta / alpha); new_a[0] = 1; new_a[++m] = 0; for(k = 0; k <= m; k++){ new_a[k] = ((a[k]) +((km) * (a[m - k]))); } alpha *= 1 - ((km) * (km)); printf("%lf\n", alpha); a = new_a; return 0; }

みんなの回答

回答No.2

基本的に、プログラムがあっているかどうかを人に聞くものではありません。たとえば私が「あっていますよ」と言えば、「そうか、あってるのか、よかった」となるのでしょうか? ちがいますよね。 あっているのかを知りたければ、手計算で10個ほど計算してみてプログラムの入力に入れてみるのです。出力値が手計算結果と同じになれば合っていると証明できますよね。 これが論理的なものの考え方ではないでしょうか。

kaiji12345
質問者

お礼

回答ありがとうございます。 確かにそのとおりですね。 自分で作成したプログラムを簡単な数字など入れてトレースすることも大切ですね。 しかし、わからないところは考えてもわからないので助言がほしかったので投稿したことはわかってくださいペコリ(o_ _)o))

noname#140270
noname#140270
回答No.1

まずは、簡単なところから、インデントしたほうがいいですよ。{}のなかを TABキーで一段さげる。そうするとずっと見やすくなります。ちなみに関数の直後に{をつけるのは一般的ではない気がします。 ●、●の部分ですが、引数を利用して関数の呼び出し元に計算結果を返すかどうかで変わってきます。値を戻すのならば、ポインタを使用します。 関数は、double levin(●, ●)と宣言されていますが、 実際にreturn 0;としており、levin()関数は、必ずゼロを返しています。 XXX = levin(aaa, bbb); でXXXに計算結果を期待しているのでしたら、このプログラムは、間違えています。 ここは、私の知識不足かもしれませんが、どのような漸化式か提示いただけないとプログラムの内容(アルゴリズム)が正しいかどうか判断できないと思います。

kaiji12345
質問者

お礼

ご回答ありがとうございます。 はい。ご指摘ありがとうございます。これからは直すようにします。 このlevin()関数では、return 0;は意味ないですよね。 補足のほうに、漸化式を表示しますので、よろしくお願いします。

kaiji12345
質問者

補足

計算機で高速に線形予測を行うレビンソン-ダービンの算法を用いています。このプログラムを今回作成しようと思い合っているかどうかを投稿させていただきました。 以下に、アルゴリズムである漸化式を表記します。 (初期設定) a0^(0)=1, α0=r0 (漸化式) M - 1 に達するまでこれらの式を繰り返します。 β_m = Σak^(m)・rm+1-k K_m+1 = -βm / αm a_0^(m+1) = 1 a_k^(m+1) = ak^(m)+Km+1・am+1-k^(m) (k=1,2,...,m+1) α_m+1 = (1-Km+1^2)αm _のついた横のmやm+1や0やkは、a0,a1,a2,a3などの順を指します。 ^(m+1)と^(m)のかっこの中身は予測係数を表します。 また、Km+1^2の2は2乗を表します。 よろしくお願いします。

関連するQ&A