
ガウスの消去法(部分ピボット選択)のプログラムを組んでみたつもりなのですが上手くいきません。
間違いだらけだと思いますがどうかアドバイスをして頂けませんでしょうか?
#include <stdio.h>
double main(void){
int i,j,k,N,M,m;
double A[N+1][N+1][N+1],B[j],S,X[N+1];
printf("次数の入力。\n");
scanf("%d",&N);
for(k=1;k<=N;k++){
for(i=1;i<=N;i++){
for(j=1;j<=N+1;j++){
A[k][i][j]=0;
}
}
}
for(i=1;i<=N;i++){
for(j=1;j<=N+1;j++){
printf("係数の入力.\n A[1][%d][%d]?\n",i,j);
scanf("%f",&A[1][i][j]);
}
}
for(k=2;k<=N;k++){
if(A[k-1][k-1][k-1]=0){
for(M=k;M<=N;M++){
if(A[k-1][M][k-1]!=0){
for(j=k-1;j<=N+1;j++){
B[j]=A[k-1][k-1][j];
A[k-1][k-1][j]=A[k-1][M][j];
A[k-1][M][j]=B[j];
}
goto abc;
}
else {printf("解は無い\n");}
}
}
abc:
for(i=k;i<=N;i++){
for(j=k;j<=N+1;j++){
A[k][i][j]=A[k-1][i][j]-(A[k-1][i][k-1]/A[k-1][k-1][k-1])*A[k-1][k-1][j];
}
}
X[N]=A[N][N][N+1]/A[N][N][N];
printf("解X(N)は %f 。\n",X[N]);
for(k=N-1;k>=1;k--){
S=0;
for(m=N;m>=k+1;m--){
S+=A[k][k][m]*X[m];
}
X[k]=(A[k][k][N+1]-S)/A[k][k][k];
printf("解X(%d)は %f 。\n",k,X[k]);}
}
}
No.1ベストアンサー
- 回答日時:
ガウス消去法には3元配列は必要なく(Cで3元配列は使えないと思うのですが)2元配列でできます。
概要は、例えば3元の連立方程式を解く場合、配列はX[3][4]を確保し、未知数の係数3×3を0~2列に、既知数の定数を3列に代入します。ピボット選択法ということですが、説明を簡単にするために、最大値の選択をしないとすると、1. 0行目の全要素X[0][0~3]をX[0][0]で割る。
2. 1行目に対してX[1][i]-=X[0][i]*X[1][0](i=0~3)を行う。2行目も同様にする。これにより、0列目はX[0][0]=1.0、X[1~2][0]=0.0となる。
これを1ステップとして、次のステップは、
1. 1行目の全要素X[1][1~2]をX[1][1]で割る。(X[1][0]は0.0なので割らなくても良い)
...
これを2行目まで繰り返すと、X[0~2][0~2]は対角要素のみが1.0で、その他は0.0の行列となり、X[0~2][3]が答えとなる。
このようにすると、X[3][4]の配列のみで計算ができます(ループカウンタ等は必要ですが)。ピボット選択法の場合は、1.の前に行の入れ替えをします。
ガウス消去法についての知識がおありな様でしたので、とりあえず概要のみの回答とさせて頂きました。(こんなことぐらい知ってるよ、という内容で参考にならないかも知れませんが...)
こんなに早く回答してくださって有難うございました。
>こんなことぐらい知ってるよ、という内容で参考にならな>いかも知れませんが・・・
知らない事ばかりです、とても参考になりました。
C言語に関する知識なんかは本当に皆無に近い状態でしたのでご指摘を受けなければ、解らないままになっていたと思います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11: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言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- Visual Basic(VBA) 1つの入力フォルダの値を読み込み、3分割をして新しい変数に代入する方法を教えていただきたいです。 読 4 2022/10/17 20:52
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
C言語で特定列だけを抽出して配...
-
C# Listを使わずに2次元配列の...
-
配列を含む構造体の初期値について
-
ExcelVBAで質問です。離れた二...
-
配列をEraseしてもメモリが開放...
-
VBからDLLへ多次元配列を渡す/...
-
VB.NET 構造体の配列の検索機能...
-
Redimした動的配列はEraseする...
-
ヘッダーファイルからの取り込...
-
VB.netでRadioButtonを配列にし...
-
配列で格納したものをmsgboxで...
-
ガウスの消去法のプログラム
-
C# 配列の変数宣言について。
-
メモリの初期値
-
c言語でのヒストグラム作成用の...
-
Functionの戻り値を2次元配列...
-
unsigned char の配列で途中で0...
-
銀行ATMの数字キーの配列
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
C# Listを使わずに2次元配列の...
-
【速いブラインドタッチ】手を...
-
配列をEraseしてもメモリが開放...
-
テキストファイルから文字列を...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
複数の選択範囲の行番号を個別...
-
C# 配列の変数宣言について。
-
C++ vectorに配列をプッシュしたい
-
配列を含む構造体の初期値について
-
VBで構造体の配列を関数に渡す...
-
C言語で特定列だけを抽出して配...
-
キーボードのキー配列について
-
ExcelVBAで質問です。離れた二...
-
2次元配列を戻り値とする関数?
-
unsigned char配列への入力の仕方
-
【C言語】配列の中に配列を入れ...
-
Redimした動的配列はEraseする...
おすすめ情報