
大学で、ガウスーヨルダンの掃き出し法により連立方程式を解き、係数マトリクスの逆行列と解を表示するプログラムを作れ、という課題が出ました。
4s+t+3u+2v=23
s+4t+3u+3v=30
5s+5t+10u+5v=65
4s+4t+2u+6v=42
という問題です。
まったく素人の状態から4時間ほどやったくらいでこの問題が出たので、解き方が全くわからなかったのですが、いろいろなサイトを巡ってこのようなプログラムを作りました。
#include <stdio.h>
#include <float.h>
#define N 4 /* 行列の行数および列数 */
double A[N][N] = { { 4.0,1.0,3.0,2.0}, /* 係数行列 A の定義 */
{1.0,4.0,3.0,3.0},
{5.0,5.0,10.0,5.0},
{4.0,4.0,2.0,6.0}};
double b[N] = {23.0,30.0,65.0,42.0}; /* 定数ベクトル b の定義 */
void Gauss_J( int, double*, double* );
void main( void )
{
int i; /* カウンタ */
printf( "%d元連立一次方程式\n", N );
for( i = 0; i < N ; i++ )
{
printf( "%g s + %g t + %g u + %g v = %g \n",
A[i][0], A[i][1], A[i][2],A[i][3], b[i] );
}
printf("の解は,\n" );
Gauss_J( N, (double *)A, (double *)b ); /* ガウス・ジョルダン法で解く */
printf( "s = %g \n", b[0] );
printf( "t = %g \n", b[1] );
printf( "u = %g \n", b[2] );
printf( "v = %g \n", b[3] );
}
void Gauss_J( int n, double *a, double *b )
{
int p, i, j, l ; /* カウンタ */
double pivot, c ; /* ピボット値 */
for ( p = 0 ; p < n ; p++ ) /* 1行目から n行目まで繰り返す */
{
pivot = a[ p*n + p ]; /* ピボットを取得する */
for ( i = p ; i < n ; i++ ) /* p行目の p列目から n列目まで */
{
a[ p*n + i ] /= pivot; /* 係数行列の p行を pivotで割る */
}
b[ p ] /= pivot; /* 定数ベクトルの p行を pivotで割る */
for ( l = 0 ; l < n ; l++ ) /* 1行目から n行目まで */
{
if ( l != p ) /* p行を除いて */
{
c = a[ l*n + p ]; /* 掃き出す */
for ( j = p ; j < n ; j++ )
{
a[ l*n + j ] -= c * a[ p*n + j ];
}
b[ l ] -= c * b[ p ];
}
}
}
return ;
}
これで行列の解は出るようになったのですが、逆行列が表示されてません。
どうすれば表示されるようになるのでしょうか?
No.2ベストアンサー
- 回答日時:
ガウスの掃き出し方は、与えられた連立方程式を行列を、
[A][x]=[B]
の形にしておいて、A行列からピボットを取り出して割ったり引いたりして、最終的に[a]行列を単位行列(対角要素が1、それ以外が0の行列)に変形していくのですが、同時に同じ操作を[B]ベクトルにも施すと、最後には[B]が答えになっているというものです。
逆行列を求めるときは、[B]ベクトルの代わりに[A]と同じ大きさの単位行列[E]を置いて、[A]を単位行列に変形したのと同じ操作を[E]にも施すと、最後には[E]が逆行列になっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語を実行すると-infが出てき...
-
プログラムでの数字につく”f”の...
-
ボール同士の衝突
-
至急です! マクロ定義で #defi...
-
プログラミングについて
-
doubleの変数にintとintの割り...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
-1.#IND00 をデバッグしたい
-
c言語で、繰り返し文の中で、0....
-
C言語のpow関数の不具合
-
関数プロトタイプ無しで、引数...
-
たくさんの数の平均を求める方...
-
timeGetTimeについて
-
C言語のプログラムで#include<m...
-
C#イベント中の戻り値の設定の...
-
fgets()による繰り返し入力(c言語)
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
C言語のプログラムを作るのに困...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
2次方程式の解を求めるプログ...
-
関数におけるif文とreturn文に...
-
doubleは常に%lfとするべきなのか
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
C言語で-23乗を取り扱うには
-
データ数の多い構造体配列
-
指数の表示
-
C言語のpow関数の不具合
-
c言語のプログラミングについて...
-
c言語のコンパイルエラー canno...
おすすめ情報