C/C++の宿題のまとめ@Wiki

ガウスの消去法

最終更新:

匿名ユーザー

- view
管理者のみ編集可
358 :デフォルトの名無しさん :2005/11/06(日) 22:47:07
2w+3x+4y-5z=0
5w+2x-2y+z=7
3w+x-y+z=6
7w+2x+y-3z=2
(注)ピボット選択必須
この連立一次方程式をガウスの消去法で解くプログラムを完成させよ
お願いします
362 :デフォルトの名無しさん :2005/11/06(日) 23:05:11
「ガウスの消去法」でyahooで検索したら、上から4番目に詳しい説明が出た。

n = 4;
double a[4][4],b[4];
a[0][0]=... みたいにして書けば動くはず。

というか既出の問題に関してはまとめサイト欲しいな...

363 :362:2005/11/06(日) 23:17:41
ピボットなしだよ。。。ごめんなさい。
364 :デフォルトの名無しさん :2005/11/06(日) 23:21:00
http://www.fuka.info.waseda.ac.jp/~kozo/suuchi/simple_equation/simple_equation_2.html
370 :(1/3):2005/11/07(月) 00:07:41
>>358
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

swap( double *x, double *y ){
double temp;
temp = *x;
*x = *y;
*y = temp;
}
main(){
int i, j, k, n=4, pibot;
double max;
double a[4][4]={{2,3,4,-5},{5,2,-2,1},{3,1,-1,1},{7,2,1,-3}};
double b[4]={0,7,6,2};
int z;
for(z=0;z<4;z++)
printf("(%5.2f)A+(%5.2f)B+(%5.2f)C+(%5.2f)D=%5.2f\n"
,a[z][0],a[z][1],a[z][2],a[z][3],b[z]);
371 :(2/3):2005/11/07(月) 00:08:24
for( i = 0; i < n; i++ ){
/* ピボット選択 */
max = 0; pibot = i;
for( j=i; j<n; j++ ){
if( fabs( a[j][i] ) > max ){
max = fabs( a[j][i] );
pibot = j;
}
}
if( pibot != i ) {
for( j = 0; j < n; j++ ){
swap( &a[i][j], &a[pibot][j] );
}
swap( &b[i], &b[pibot] );
}

/* 前進消去 */
for( j = i+1; j < n; j++ ){
a[i][j] /= a[i][i];
}
b[i] /= a[i][i];
for( k = i+1; k < n; k++ ){
for( j = i+1; j < n; j++ ){
a[k][j] -= a[i][j] * a[k][i];
}
b[k] -= b[i] * a[k][i];
}
372 :(3/3):2005/11/07(月) 00:09:02
/* 後退代入 */
for( i = n-1; i >= 0; i-- ){
for( j = i+1; j < n; j++ ){
b[i] -= a[i][j] * b[j];
}
}

/* 出力 */
printf( "解A=%5.2f\n", b[0] );
printf( "解B=%5.2f\n", b[1] );
printf( "解C=%5.2f\n", b[2] );
printf( "解D=%5.2f\n", b[3] );

}

あと、氏ねカス

373 :カス:2005/11/07(月) 00:29:17
>>372
ありがとっす
目安箱バナー