大学の課題が分かりません、ご教授よろしくお願いします。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Frontriver

大学の課題が分かりません、ご教授よろしくお願いします。

#1

投稿記事 by Frontriver » 6年前

大学の課題で行列の計算(掃き出し法)を行うプログラ厶をc言語で作る課題が出ました。途中までのプログラムは以下の通りです。
/*gj.c*/
#include<stdio.h>
#include<math.h>
#define N 10
main()
{
double a[N][N+1];
double akk,aik;
int i,j,k,n,mi,tmp;

printf("n(<%2d) =",N+1);
scanf("%d",&n);

for(i=0;i<n;i++)
for(j=0;j<n+1;j++){
printf("a[%d][%d] = ",i,j);
scanf("%lf",&a[j]);
}

for(k=0;k<n;k++){
mi = k;
for(i=k+1;i<n;i++)if(fabs(a[k]) > fabs(a[mi][k])) mi = i;
tmp = mi;
k = tmp;
mi = i;

akk = a[k][k];
for(j=k;j<n+1;j++)a[k][j] /= akk;
for(i=0;i<n;i++){
if(i != k){
aik = a[k];
for(j=k;j<n+1;j++) a[j] -= aik*a[k][j];
}
}


printf("------------------------------------\n");
for(i=0;i<n;i++){
for(j=0;j<n+1;j++)printf("%10.5f",a[j]);
printf("\n");
}
}
for(i=0;i<n;i++)printf("%10.5f\n",a[n]);
}
[tl181247@peodbm03-( ~/C )-503]gcc gj.c -o gj
[tl181247@peodbm03-( ~/C )-504]./gj < ./gj.dat


動作確認
n(<11) =a[0][0] = a[0][1] = a[0][2] = a[0][3] = a[1][0] = a[1][1] = a[1][2] = a[1][3] = a[2][0] = a[2][1] = a[2][2] = a[2][3] = ------------------------------------
0.00000 0.00000 -3.50000 -23.50000
8.00000 1.00000 2.50000 7.50000
3.00000 0.00000 -11.50000 -36.50000
------------------------------------
0.00000 0.00000 0.00000 -12.39130
8.00000 1.00000 0.00000 -0.43478
3.00000 0.00000 1.00000 3.17391
-12.39130
-0.43478
3.17391
ピボットの値が1以上なら計算値が出るものの、このように最初の値を0で入力すると答えを出すことが出来ません。行列計算で行の入れ替えを行えば答えを出すことが出来るので、そこまでは分かるのですが、tmpという箱に一旦保存して入れ替える方法がどうしても出来ません。アドバイスだけでもいいので、どうかよろしくお願いします。
提出期限が木曜日の夜までなので、木曜日の夜までには仕上げたいです。

かずま

Re: 大学の課題が分かりません、ご教授よろしくお願いします。

#2

投稿記事 by かずま » 6年前

Frontriver さんが書きました:
6年前

コード:

    tmp = mi;
    k = tmp;
    mi = i;
行列計算で行の入れ替えを行えば答えを出すことが出来るので、そこまでは分かるのですが、tmpという箱に一旦保存して入れ替える方法がどうしても出来ません。
i の行と、mi の行を入れ替えるのだから、

コード:

		for (i = 0; i < n + 1; i++)
			tmp = a[k][i], a[k][i] = a[mi][i], a[mi][i] = tmp;
ただし、int tmp; ではなく、double tmp;

かずま

Re: 大学の課題が分かりません、ご教授よろしくお願いします。

#3

投稿記事 by かずま » 6年前

かずま さんが書きました:
6年前
i の行と、mi の行を入れ替えるのだから、
すみません。間違えました。
 k の行と、mi の行を入れ替えるのだから、
ですね。

Frontriver

Re: 大学の課題が分かりません、ご教授よろしくお願いします。

#4

投稿記事 by Frontriver » 6年前

なるほど、まずfor文でくくった後に、配列で代入してあげるのですね。全然分からなかったのでとても助かりましたm(_ _)m
ご教授して頂きありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る