□投稿者/ セルピコ (7回)-(2008/11/12(Wed) 01:11:27)
|
分類:[.NET 全般]
2008/11/12(Wed) 01:22:31 編集(投稿者) 2008/11/12(Wed) 01:12:28 編集(投稿者)
プログラム初心者です。visual C++でCを使ってプログラムを書いています。 以下のプログラムで、CSVファイルからデータを読み込んで、掃き出し法を使っ て3元1次方程式を解くようにしたいのですが、forループ(矢印の箇所)の1順 目はちゃんと変数が入り計算できるのですが2順目以降からは3行3列の単位 行列が表示されてしまします。原因が分からず困っています。どこを直せばよ いのでしょうか? よろしくお願いします。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define DATASIZE 1000 #define N 3
double freqArray[DATASIZE]; double dbArray[DATASIZE];
int main(void) { char csvfilename[40]; char buf[256]; int fval; double dbval; int index = 0; int i = 0;
FILE *csvfile; //音声工房で生成したスペクトルファイルを開く
label1:printf ("音声工房で生成したスペクトルファイル名を入力して下さい。"); fflush (stdin); gets (csvfilename); if ( strlen(csvfilename ) == 0) return 0;
if( (csvfile = fopen( csvfilename, "r" )) == NULL ) { printf( "ファイル '%s' は開けませんでした。\n\n", csvfilename ); goto label1; } //ファイルデータの周波数、デシベルパワーをそれぞれ配列データを作る
//printf( "周波数[Hz] デシベルパワー[dB] \n" );
while( fgets( buf, 256, csvfile ) != NULL ) {
if (sscanf(buf, "%d , %lf", &fval, &dbval) != 2) { printf("# データフォーマットエラー '%s'\n", buf); exit(1); } else if (index >= sizeof(dbArray) / sizeof(dbArray[0])) { printf("# データ数が最大個数(%d)を超過\n", sizeof(dbArray) / sizeof(dbArray[0])); exit(1); } else { //printf(" %d[Hz] %lf[dB]\n", fval, dbval); freqArray[index] = fval; dbArray[index] = dbval; index++; } } printf( "%d 個のデータを取得しました\n", index );
//放物線近似をするための3点の決定
for ( i = 1; i <= index-2; i++ ) {
if ( dbArray[i-1] > dbArray[i] ) { if ( dbArray[i] < dbArray[i+1] ) { printf ( " dbArray[%d]=%lf dbArray[%d]=%lf dbArray[%d]=%lf \n", i-1, dbArray[i-1], i, dbArray[i], i+1, dbArray[i+1] ); static double a[N][N+1] = { pow( freqArray[i-1], 2), freqArray[i-1], 1.0, dbArray[i-1], pow( freqArray[i], 2), freqArray[i], 1.0, dbArray[i], pow( freqArray[i+1], 2), freqArray[i+1], 1.0, dbArray[i+1] }; double p; double d; int i, j, k; for (i = 0; i < N; i++) ←変数を読み込まない { for (j = 0; j < N; j++) printf("%f\t", a[i][j]); printf("x[%d]\t", i); printf("%f\n", a[i][N]); } for (k = 0; k < N; k++) { p = a[k][k]; for (j = k; j < N+1; j++) a[k][j] /= p; for (i = 0; i < N; i++) { if (i != k) { d = a[i][k]; for (j = k; j < N+1; j++) a[i][j] -= d*a[k][j]; } } } printf("Solutions:\n"); for (k = 0; k < N; k++) printf("x[%d] = %f\n", k, a[k][N]); } } } fclose ( csvfile ); return 0; }
|
|