C言語の質問です。
講義の最終テストが終わったので講義で飛ばされた「LU分解法にピボット選択機能をつけたプログラム」を実装しようと思い試行錯誤したのですが、どうにもうまく実装できません。とはいえまだ他の講義のテストはまだ全然終わっていないのであまり時間をかけたくないのが正直なところです。どなたか、説明なしの答えだけでも良いので教えていただけませんか?
参考までに以下に、ピボット機能なしのプログラムコードを貼っておきます。
*連立方程式を
「aw+bx+cy+dz=e
fw+gx+hy+iz=j
kw+lx+my+nz=o
pw+qx+ry+sz=t」
と置くと、標準入力として
a b c d
f g h i
k l m n
p q r s
e j o t
と入力し、答えを表示させるコードになります。(見にくくてすみません。講義で取り扱ったピボット選択機能なし版LU分解法のコードの問題がこの入力方式だったもので...)
(コード)
#include <stdio.h>
#define M 4
int main(){
//変数宣⾔
double a[M][M];
double b[M];
double c[M];
double l[M][M];
double u[M][M];
double x[M];
int i, j, k;
//⼊⼒データの受け取り
for(i=0;i<M;i++){
for(j=0;j<M;j++) scanf("%lf",&a[i][j]);
}
for(i=0;i<M;i++){
scanf("%lf",&b[i]);
}
//L⾏列,U⾏列の初期化
for(i = 0; i < M; i++){ /* L行列,U行列を1と0で初期化 */
for(j = 0; j < M; j++){
u[i][j] = 0;
if(i == j)
l[i][j] = 1;
else
l[i][j] = 0;
}
}
//⼊⼒⾏列の出⼒(ピボッティングでa⾏列を操作するため事前に出⼒)
printf("⼊⼒⾏列\n");
for(i=0;i<M;i++){
for(j=0;j<M;j++){
printf("%10.5lf",a[i][j]);
}
printf("%10.5lf\n",b[i]);
}
//結果の出⼒
for(i = 0; i < M; i++){
for(j = i; j < M; j++){
/* U行列の生成 */
u[i][j] = a[i][j];
for(k = 0; k < i; k++){
u[i][j] -= u[k][j] * l[i][k];
}
}
for(j = i+1; j < M; j++){
/* L行列の生成 */
l[j][i] = a[j][i];
for(k = 0; k < i; k++){
l[j][i] -= u[k][i] * l[j][k];
}
l[j][i] /= u[i][i];
}
}
for(i = 0; i < M; i++){
/* c行列の生成 */
c[i] = b[i];
for(j = 0; j < i; j++){
c[i] -= l[i][j] * c[j];
}
}
for(i = M - 1; i >= 0; i--){
/* x行列の生成 */
x[i] = c[i];
for(j = M - 1; j > i; j--){
x[i] -= u[i][j] * x[j];
}
x[i] /= u[i][i];
}
//L⾏列
printf("\nL⾏列\n");
for(i=0;i<M;i++){
for(j=0;j<M;j++){
printf("%10.5lf",l[i][j]);
}
printf("\n");
}
//U⾏列
printf("\nU⾏列\n");
for(i=0;i<M;i++){
for(j=0;j<M;j++){
printf("%10.5lf",u[i][j]);
}
printf("\n");
}
//解の出⼒
printf("\n答え\n");
for(i=0;i<M;i++){
printf("%10.5lf\n",x[i]);
}
No.1ベストアンサー
- 回答日時:
行だけ入れ替える、部分ピボット選択だけならば
LU 分解前に以下の処理追加
for (i=0; i<M; i++) {
_ pivot = 絶対数が最大である行を探す(a, M, i);
_ // 検索対象 : a[i][i] から a[i][M-1] の範囲
_
_ if (i != pivot) {
_ _ 行を入れ替える(a, M, i, pivot); // i行とpivot行を入れ替え
_ _ 値を入れ替える(b, M, i, pivot); // ベクトル B も同様
_ }
}
行と列を入れ替える、完全ピボット選択を目指すなら
for (i=0; i<M; i++) {
_ pivot = 絶対数が最大である行と列を探す(a, M, i);
_ // 検索対象 : a[i][i] から a[M-1][M-1] の範囲
_
_ if (i != pivot.row) {
_ _ 行を入れ替える(a, M, i, pivot.row); // i行とpivot行を入れ替え
_ _ 値を入れ替える(b, M, i, pivot.row); // ベクトル B も同様
_ }
_ if (i != pivot.col) {
_ _ 列を入れ替える(a, M, i, pivot.col);
_ }
_ ベクトルxの並び順[i] = pivot.col; // 計算後にxを並び替える
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- 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# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で四則演算を使って10を作...
-
wsprintfの書式制御文字列につ...
-
C言語です このプログラミング...
-
10個出力で改行したいのですが...
-
TeraPadの設定方法
-
万年カレンダーのC言語プログラ...
-
困ってます!Cプログラミングに...
-
4の倍数を論理演算で表す。。
-
両替プログラムなど
-
C言語で四則演算を使って結果が...
-
printf で二進表示を行いたい。
-
2の累乗を計算するプログラム...
-
C言語についてです学籍番号、名...
-
カレンダーのプログラムについて
-
switch文とscanfについて
-
一番大きい奇数を表示する
-
printf( " %2d", p * q );
-
ホームページをC言語で作りたい...
-
空Enterの扱い方
-
C言語について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報