連立方程式をつくプログラムの解読

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
carnage0216
記事: 20
登録日時: 6年前

連立方程式をつくプログラムの解読

#1

投稿記事 by carnage0216 » 5年前

環境 Windows10,visual studio2017

コード:

#include <stdio.h>

#define N  3   //the dimension of equation

void vec_diff(float a[N], float b[N]){
    /* Calcurate the difference of two vectors. Be caution that b[N] changes.*/
    for (int i = 0; i < N; i++){
        b[i] -= a[i];
    }
}

int main(){
    float m[N][N] = {{5,-1,-1}, {2,1,-3},{1,1,1}};    // The matrix
    float b[N] = {0,-5,6};

    printf("The coefficient matrix is : \n");
    for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++){
            printf("%1.f ", m[i][j]);
            if (j == N-1){
                printf("\n");
            }
        }
    }

    printf("\nUse Gauss method to solve equations : \n");
    for (int i = 0; i < N; i++){
        for (int j = i+1; j < N; j++){
            float coef = m[j][i] / m[i][i];
            float del[N];

            for (int k = 0; k < N; k++){
                del[k] = m[i][k] * coef;
            }
            vec_diff(del, m[j]);
            b[j] -= b[i] * coef;
        }
    }

    for (int i = N -1; i >= 0; i--){
        float x = 1. / m[i][i];
        m[i][i] *= x;
        b[i] *= x;

        for (int j = 0; j < i; j++){
            b[j] -= b[i]*m[j][i];
            m[j][i] = 0;
        }
    }

    for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++){
            printf("%1.f ", m[i][j]);
            if (j == N - 1){
                printf("\n");
            }
        }
    }

    for (int i = 0; i < N; i++){
        printf("%f ", b[i]);
    }

    return 0;
}

コード:

#define N  3   //the dimension of equation

void vec_diff(float a[N], float b[N]){
    /* Calcurate the difference of two vectors. Be caution that b[N] changes.*/
    for (int i = 0; i < N; i++){
        b[i] -= a[i];
    }
}
に関してなのですが連立方程式から得られた{5,-1,-1}, {2,1,-3},{1,1,1}を基にx,y,zを求めるのですが、
以上のプログラムの部分が計算過程の何をしているのかいまいちわかりません。
プログラムを読む限り各変数を求めるための引き算ではないかと思うのですが。
またprintfで処理過程の中身を見ようとしたところ以下のように出ました。これは何を表しているのでしょうか?
また正しいのでしょうか?

コード:

void vec_diff(float a[N], float b[N]) { 
	for (int i = 0; i < N; i++) {
		printf("[%d]%f - %f =", i, b[i], a[i]);
		printf("%f\n", b[i] -= a[i]);
	}
}
にして実行しました。

コード:

[0]2.000000 - 2.000000 =0.000000
[1]1.000000 - -0.400000 =1.400000
[2]-3.000000 - -0.400000 =-2.600000
[0]1.000000 - 1.000000 =0.000000
[1]1.000000 - -0.200000 =1.200000
[2]1.000000 - -0.200000 =1.200000
[0]0.000000 - 0.000000 =0.000000
[1]1.200000 - 1.200000 =0.000000
[2]1.200000 - -2.228571 =3.428571
参考にしたサイトは以下のものです。
https://qiita.com/haya_walker/items/d64 ... c65a324fa2

どうかよろしくお願い致します。

かずま

Re: 連立方程式をつくプログラムの解読

#2

投稿記事 by かずま » 5年前

carnage0216 さんが書きました:
5年前
またprintfで処理過程の中身を見ようとしたところ以下のように出ました。これは何を表しているのでしょうか?
次のプログラムの実行結果の
 m[1] -= del
 m[2] -= del
 m[2] -= del
でしょう。

コード:

#include <stdio.h>

#define N  3   //the dimension of equation

void vec_diff(float a[N], float b[N]){
    /* Calcurate the difference of two vectors. Be caution that b[N] changes.*/
    for (int i = 0; i < N; i++){
        b[i] -= a[i];
    }
}

void show(float m[N][N], float b[N])
{
    for (int i = 0; i < N; i++){
		printf("m[%d] = {", i);
        for (int j = 0; j < N; j++) printf("%4g ", m[i][j]);
		printf("}   b[%d] = %4g\n", i, b[i]);
    }
}

int main(){
    float m[N][N] = {{5,-1,-1}, {2,1,-3},{1,1,1}};    // The matrix
    float b[N] = {0,-5,6};

    printf("The coefficient matrix is : \n");
	show(m, b);

    printf("\nUse Gauss method to solve equations : \n");
    for (int i = 0; i < N; i++){
        for (int j = i+1; j < N; j++){
            float coef = m[j][i] / m[i][i];
            float del[N];

			printf("coef  = m[%d][%d] / m[%d][%d] = %g / %g = %g\n",
					j, i, i, i, m[j][i], m[i][i], coef);

            for (int k = 0; k < N; k++){
                del[k] = m[i][k] * coef;
            }
			printf("del   = m[%d] * coef = m[%d] * %g  = {", i, i, coef);

            vec_diff(del, m[j]);
			for (int k = 0; k < N; k++) printf(" %g ", del[k]);
			printf("}\n" "m[%d] -= del     m[%d] = {", j, j);

            b[j] -= b[i] * coef;
			for (int k = 0; k < N; k++) printf(" %g ", m[j][k]);
			printf("}\n" "b[%d] -= b[%d] * coef = b[%d] * %g   b[%d] = %g\n\n",
					j, i, i, coef, j, b[j]);
        }
    }

	show(m, b); printf("\n");

    for (int i = N -1; i >= 0; i--){
        float x = 1. / m[i][i];
        m[i][i] *= x;
        b[i] *= x;

        for (int j = 0; j < i; j++){
            b[j] -= b[i]*m[j][i];
            m[j][i] = 0;
        }
		show(m, b); printf("\n");
    }

    for (int i = 0; i < N; i++){
        printf("%f ", b[i]);
    }

    return 0;
}
実行結果

コード:

The coefficient matrix is : 
m[0] = {   5   -1   -1 }   b[0] =    0
m[1] = {   2    1   -3 }   b[1] =   -5
m[2] = {   1    1    1 }   b[2] =    6

Use Gauss method to solve equations : 
coef  = m[1][0] / m[0][0] = 2 / 5 = 0.4
del   = m[0] * coef = m[0] * 0.4  = { 2  -0.4  -0.4 }
m[1] -= del     m[1] = { 0  1.4  -2.6 }
b[1] -= b[0] * coef = b[0] * 0.4   b[1] = -5

coef  = m[2][0] / m[0][0] = 1 / 5 = 0.2
del   = m[0] * coef = m[0] * 0.2  = { 1  -0.2  -0.2 }
m[2] -= del     m[2] = { 0  1.2  1.2 }
b[2] -= b[0] * coef = b[0] * 0.2   b[2] = 6

coef  = m[2][1] / m[1][1] = 1.2 / 1.4 = 0.857143
del   = m[1] * coef = m[1] * 0.857143  = { 0  1.2  -2.22857 }
m[2] -= del     m[2] = { 0  0  3.42857 }
b[2] -= b[1] * coef = b[1] * 0.857143   b[2] = 10.2857

m[0] = {   5   -1   -1 }   b[0] =    0
m[1] = {   0  1.4 -2.6 }   b[1] =   -5
m[2] = {   0    0 3.42857 }   b[2] = 10.2857

m[0] = {   5   -1    0 }   b[0] =    3
m[1] = {   0  1.4    0 }   b[1] =  2.8
m[2] = {   0    0    1 }   b[2] =    3

m[0] = {   5    0    0 }   b[0] =    5
m[1] = {   0    1    0 }   b[1] =    2
m[2] = {   0    0    1 }   b[2] =    3

m[0] = {   1    0    0 }   b[0] =    1
m[1] = {   0    1    0 }   b[1] =    2
m[2] = {   0    0    1 }   b[2] =    3

1.000000 2.000000 3.000000 

よもやま
記事: 68
登録日時: 8年前
連絡を取る:

Re: 連立方程式をつくプログラムの解読

#3

投稿記事 by よもやま » 5年前

carnage0216 さんが書きました:
5年前
環境 Windows10,visual studio2017
連立方程式を解くプログラムで、なぜベクトルで引き算を行うのかわかりません。
えっと・・マルチポストするならするで関連して投稿している事を記載しておきましょうよ。

返信

“C言語何でも質問掲示板” へ戻る