C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: 3元1次方程式


(過去ログ 50 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■27670 / inTopicNo.1)  3元1次方程式
  
□投稿者/ セルピコ (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;
}
引用返信 編集キー/
■27673 / inTopicNo.2)  Re[1]: 3元1次方程式
□投稿者/ やじゅ (776回)-(2008/11/12(Wed) 03:55:59)
やじゅ さんの Web サイト
2008/11/12(Wed) 04:09:03 編集(投稿者)
No27670 (セルピコ さん) に返信
> forループ(矢印の箇所)の1順目はちゃんと変数が入り計算できるのですが
> 2順目以降からは3行3列の単位行列が表示されてしまします。
> 原因が分からず困っています。どこを直せばよいのでしょうか?

ソースは、投稿モードにある図表モードで投稿するといいですよ。
インデントが崩れてるので、インデントしてみます。

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]);
}

引用返信 編集キー/
■27678 / inTopicNo.3)  Re[2]: 3元1次方程式
□投稿者/ επιστημη (1377回)-(2008/11/12(Wed) 09:40:10)
επιστημη さんの Web サイト
カッコつけ損ねてますねぇ♪

引用返信 編集キー/
■27679 / inTopicNo.4)  Re[1]: 3元1次方程式
□投稿者/ .SHO (15回)-(2008/11/12(Wed) 09:53:55)
慣れるまでは、実行文が1行のfor文やif文でも
すべてに{}を付けるようにした方がいいかも知れないですね。
つまらない間違いに時間を取られるともったいないです。

引用返信 編集キー/
■27681 / inTopicNo.5)  Re[2]: 3元1次方程式
□投稿者/ セルピコ (8回)-(2008/11/12(Wed) 10:27:24)

> 慣れるまでは、実行文が1行のfor文やif文でも
> すべてに{}を付けるようにした方がいいかも知れないですね。
みなさんアドバイスありがとうございます。
はじめのfor文や1行のfor文にも{}かっこつけてみたのですが、
やはりうまくいきません。

どうしてでしょうか?
引用返信 編集キー/
■27682 / inTopicNo.6)  Re[3]: 3元1次方程式
□投稿者/ .SHO (16回)-(2008/11/12(Wed) 10:34:58)
> どうしてでしょうか?

「変数を読み込まない」というところだけでいいので
{}をつけたやつを、もう1度図表モードで投稿してください。
引用返信 編集キー/
■27723 / inTopicNo.7)  Re[4]: 3元1次方程式
□投稿者/ セルピコ (9回)-(2008/11/12(Wed) 23:38:50)
2008/11/12(Wed) 23:42:36 編集(投稿者)
No27682 (.SHO さん) に返信


> 「変数を読み込まない」というところだけでいいので
> {}をつけたやつを、もう1度図表モードで投稿してください。

遅くなって申し訳ありません。

for ( i = 1; i <=15; 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]);}
			}

引用返信 編集キー/
■27726 / inTopicNo.8)  Re[5]: 3元1次方程式
□投稿者/ dogatana (5回)-(2008/11/13(Thu) 00:13:41)
No27723 (セルピコ さん) に返信
> 2008/11/12(Wed) 23:42:36 編集(投稿者)
>
> ■No27682 (.SHO さん) に返信
>
>
>>「変数を読み込まない」というところだけでいいので
>>{}をつけたやつを、もう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]
> };

これは a が static な配列なので、最初だけしか初期化されないのでは。
static をはずしましょう。

引用返信 編集キー/
■27729 / inTopicNo.9)  Re[6]: 3元1次方程式
□投稿者/ セルピコ (10回)-(2008/11/13(Thu) 01:16:21)
2008/11/13(Thu) 01:16:37 編集(投稿者)

>>■No27682 (.SHO さん) に返信
>>
> これは a が static な配列なので、最初だけしか初期化されないのでは。
> static をはずしましょう。
>
.SHO さん、ありがとうございました。
無事、変数を読み込むことができました。
夜分にもかかわらず、本当にありがとうございました。
解決済み
引用返信 編集キー/
■27742 / inTopicNo.10)  Re[7]: 3元1次方程式
□投稿者/ .SHO (23回)-(2008/11/13(Thu) 10:37:20)
>>これは a が static な配列なので、最初だけしか初期化されないのでは。
>>static をはずしましょう。
>>
> .SHO さん、ありがとうございました。
> 無事、変数を読み込むことができました。
> 夜分にもかかわらず、本当にありがとうございました。

解決したのならまぁいいですが、これは私が書いたのではありません^^;
で、static が付いてるのは問題ないです。
引用返信 編集キー/
■27758 / inTopicNo.11)  Re[8]: 3元1次方程式
□投稿者/ dogatana (7回)-(2008/11/13(Thu) 21:26:33)
書いた本人です ^^;

■No27742 (.SHO さん) に返信
> で、static が付いてるのは問題ないです。

意味的にはこれが問題なのでは?
#include <iostream>
int main()
{
    for (int i = 0; i < 3; i++) {
        static int val = i;
        std::cout << "i = " << i << ", val = " << val << std::endl;
    }
}
とすると、初回のループ実行時に初期化されるだけで、val は常に0になるので。

#履き出し法で連立方程式を解くのは大昔fortranでやった覚えがあります ^^;

引用返信 編集キー/
■27762 / inTopicNo.12)  Re[9]: 3元1次方程式
□投稿者/ .SHO (24回)-(2008/11/14(Fri) 09:16:35)
> 意味的にはこれが問題なのでは?

これ、C++ じゃなくて C ですよね。

引用返信 編集キー/
■27764 / inTopicNo.13)  Re[10]: 3元1次方程式
□投稿者/ .SHO (25回)-(2008/11/14(Fri) 09:23:42)
もっとも C だったら、途中で変数宣言とかできないけど…

最初に

> visual C++でCを使ってプログラムを…

と書いてあったので C として答えてましたが
これって visual C++ でソースファイルの拡張子は .cpp で
C のつもりで書いてるって事なのかな??
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -