![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ガウスの消去法で、n変数n式の連立一次方程式を解くプログラムを
作っています。
ですが、前進消去およびピボット選択ははおそらくできたのですが
後退代入が悪いのか、答えが出ません。
もしかしたら前進消去部分も悪いのかもしれませんが;;
いろいろ調べたのですが
どうしたら直るのかわからなくなってしまいました。
どのようにして直せばいいのか教えてください。
プログラムは以下です。
#include<stdio.h>
#include<math.h>
#define SIZE 100/*上限MAXのマクロ定義*/
#define EPS (1.0e-5)
int main()
{
/*変数宣言*/
int n; /*連立方程式の式数*/
int i; /*1つ目のループカウンタ*/
int j; /*2つ目のループカウンタ*/
int k;/*3つ目のループカウンタ*/
int pivot; /*pivot選択を行う際に使用する変数*/
double max; /*pivot選択用の絶対値が最大の値*/
double matrix_a[SIZE][SIZE]; /*変数xijの係数aij*/
double matrix_b[SIZE]; /*式iの定数項bi*/
double a_hozon;/*matrix_aの値を一時保存する変数*/
double b_hozon;/*matrix_bの値を一時保存する変数*/
double r_hozon;/*前進消去法をする時使用する値を一時保存する変数*/
int l;
int m;
/*入力処理*/
/*未知数nの入力*/
printf("n変数n式の連立一次方程式を解きます。\n");
printf("式数n(1~100)を入力してください。 n=?\n");
scanf("%d",&n);
/*未知数nのチェック*/
if(n>SIZE||n<1)
{
printf("\n\nn=%dはプログラムの利用可能範囲外です。\n",n);
return -1;
}
printf("%d変数%d式の一次方程式を入力して下さい。\n",n,n);
printf("入力は、式毎に係数、定数項の順に行ってください。\n\n");
printf("連立一次方程式の拡大係数行列を表示します。\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%lf",&matrix_a[i][j]);
}
scanf("%lf",&matrix_b[i]);
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%6.2f",matrix_a[i][j]);
}
printf("|%6.2f\n",matrix_b[i]);
}
printf("計算します。\n");
/*pivot選択*/
for(k=0; k<n; k++)
{
max=0.0;
pivot=0;
for(i=k; i<n; i++)
{
if(fabs(matrix_a[i][k])>max)
{
max=fabs(matrix_a[i][k]);
pivot=i;
}
}
if(matrix_a[pivot][k]==0.0)
{
printf("正則性なし\n");
}
if(pivot!=k)
{
for(j=0; j<n; j++)
{
a_hozon = matrix_a[k][j];
matrix_a[k][j] = matrix_a[pivot][j];
matrix_a[pivot][j] = a_hozon;
}
b_hozon = matrix_b[k];
matrix_b[k] = matrix_b[pivot];
matrix_b[pivot] = b_hozon;
}
}
/*入れ換え後の行列を表示*/
for(l=0; l<n; l++)
{
for(m=0; m<n; m++)
{
printf("%6.2f",matrix_a[l][m]);
}
printf("|%6.2f\n",matrix_b[l]);
}
/*消去法*/
for(k=0; k<n; k++)
{
for(i=k+1; i<n-1; i++)
{
r_hozon = matrix_a[i][k]/matrix_a[k][k];
for(j=k; j<n; j++)
{
matrix_a[i][j] = matrix_a[i][j]-r_hozon*matrix_a[k][j];
}
matrix_b[i] = matrix_b[i]-r_hozon*matrix_b[k];
}
}
/*後退代入*/
for(i=n-1; i>=0; i--)
{
matrix_b[i]=0.0;
for(j=i+1; j<n; j++)
{
matrix_b[i]=matrix_b[i]-matrix_a[i][j]*matrix_b[j];
}
}
/*
for(i=n-1; i>0; i--)
{
temp = 0.0;
for(j=i+1; j<n; j++)
{
xn = b[n]/a[n][n];
xn-1 = (-a[n-1][n]*x[n]+b[n-1])/a[n-1][n-1];
xn-2 = (-a[n-2][n-1]*x[n-2]+a[n-2][n]*x[n]+b[n-2])/a[n-2][n-2];
xn-j = (-a[i][n-j]*x[i+1]+b[i])/a[i][i];
temp = matrix_a[][]
temp=temp+matrix_a[i][j]*matrix_a[j][n];
matrix_a[i][n]=matrix_a[i][n]-temp;
matrix_a[i][n]=matrix_a[i][n]/matrix_a[i][i];
}
}
*/
/*不定、不能の判別*/
if(matrix_a[k][k]<EPS)
{
printf("解は一意に求まらない。\n");
return -1;
}
/*出力処理*/
printf("連立一次方程式の解を表示します。\n");
for(i=0; i<n; i++)
{
printf("x%d = %6.2f\n",i,matrix_b[i]);
}
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
8人分のテストの点数を入力し、...
-
unsigned int型について
-
【C言語教えてください】sin波...
-
コマンドラインに出力した文字...
-
strcmp
-
スレッドとメッセージキューに...
-
getchar()マクロによる空白文字...
-
C言語 タイマーのソースについて
-
C言語プログラミング
-
インクリメント演算子をprintf...
-
printfでSegmentation fault
-
BMI値から体型を判定するプログ...
-
C言語 配列の構造体を下位関数...
-
srand(time(NULL))の使い方
-
C言語の数値入力
-
WM_CLOSEで閉じれないウィンド...
-
int型 00 を表示するのに0とな...
-
C言語について
-
scanfで正しい値を入力できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
4の倍数を論理演算で表す。。
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
scanfに文字が入力されたときに...
-
hit&bolwのプログラミングがで...
-
%P と %X の違い
-
unsigned int型について
-
printf( " %2d", p * q );
-
cshの文字列操作(0埋め)
-
改行について 1行に何個かづ...
-
8人分のテストの点数を入力し、...
-
入力したお金の金額からお札の...
-
三角形の判別
-
テキストカーソル位置の取得
おすすめ情報