連立方程式を解くプログラムを多元線形連立方程式にするには

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

連立方程式を解くプログラムを多元線形連立方程式にするには

#1

投稿記事 by carnage0216 » 5年前

連立方程式を解くプログラムを多元線形連立方程式にするには。

コード:

#include <stdio.h>
#include <time.h>

#define N  3 

int main(void) {

    clock_t start, end;
    start = clock();


    float a[N][N+1] = {
    {5,-1,-1,0},
    { 2,1,-3,-5 },
    { 1,1,1 ,6} };    // The matrix

    //前進消去
    int i;

    float d = a[1][0] / a[0][0];


    for (i = 0; i <= 3; i++) {//forを使う上で上限がなかったので3までが上限なのでi<=3と書いた。
        a[1][i] = a[1][i] - a[0][i] * d;
        {
            printf("a[1][%d]=%fとなる\n", i,a[1][i]);
        }



    }


    float r;
    r = a[2][0] / a[0][0];
    for (i = 0; i <= 3; i++) {
        a[2][i] = a[2][i] - a[0][i] * r;
    }
    int I;
    for (I = 0; I <= 3; I++) {
        printf("a[2][%d]=%fとなる\n", I,a[2][I]);
        }

    float z;
    z= a[2][1] / a[1][1];
    int y; //iは1から3まで入るのでkに+1した形で入ってもらいiを利用する。kはforより3までとする。
    for (y = 0; y <= 3; y++) {
        a[2][y] = a[2][y] - a[1][y] * z;
        printf("a[2][%d]=%fとなる\n", y, a[2][y]);
    }
//前進消去終わり
//後退代入
    float g = a[2][3] / a[2][2];
    printf("Z=%f\n", g);

    float h;
    h = a[1][3] / a[1][1] - a[1][2] / a[1][1]* a[2][3] / a[2][2];
    printf("Y=%f\n", h);

    float j;
    j = h / a[0][0] + g / a[0][0];
    printf("X=%f\n", j);
    end = clock();
    printf("%f sec\n", (double)(end - start) / CLOCKS_PER_SEC);

    return 0;
}
//後退代入終わり
以上のプログラムを多元線形連立方程式にできないでしょうか?
どうかよろしくお願いいたします。
またできるならば多元線形連立方程式のプログラムにできるのならばその過程も教えていただけるとありがたいです。

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

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#2

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

carnage0216 さんが書きました:
5年前
連立方程式を解くプログラムを多元線形連立方程式にするには。



以上のプログラムを多元線形連立方程式にできないでしょうか?
どうかよろしくお願いいたします。
またできるならば多元線形連立方程式のプログラムにできるのならばその過程も教えていただけるとありがたいです。
連立方程式をfor文でコンパクトかつ#define N のNの数字を変えるだけで多元線形連立方程式を解くことができるようにするには。
えっと、マルチポストされるのは構わないんですが、
投稿するだけして、放置を何回もされると回答される方の善意やら労力やら無視し自己中心的な人だなってなりますよ。。


かずま

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#4

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

carnage0216 さんが書きました:
5年前
以上のプログラムを多元線形連立方程式にできないでしょうか?
どのようにしてプログラムを書いたのか。 で既に出来ています。

そこの C++ のプログラムを C に書き換えてみました。

コード:

#include <stdio.h> 

#define N 3    // or 4

void GaussElimination(double a[N][N+1])
{
    for (int i = 0; i < N; i++) {         // 元の連立方程式を出力
        for (int j = 0; j < N; j++)
            printf("%+f x%d ", a[i][j], j + 1);
        printf("= %+f\n", a[i][N]);
    }
    for (int k = 0; k < N -1; k++) {      // 前進消去
        for (int i = k + 1; i < N; i++) {
            double d = a[i][k] / a[k][k];
            for (int j = k + 1; j <= N; j++)
                a[i][j] -= a[k][j] * d;
        }
    }
    for (int i = N - 1; i >= 0; i--) {    // 後退代入
        double d = a[i][N];
        for (int j = i + 1; j < N; j++)
            d -= a[i][j] * a[j][N];
        a[i][N] = d / a[i][i];
    }
    for (int k = 0; k < N; k++)           // 結果出力
        printf("x%d = %f\n", k + 1, a[k][N]);
}

int main(void)
{
    static double a[N][N + 1] = {
#if N == 3
		{ 5, -1, -1,  0 },
		{ 2,  1, -3, -5 },
		{ 1,  1,  1,  6 }
#elif N == 4
        {  1, -2,  3, -4,  5 },
        { -2,  5,  8, -3,  9 },
        {  5,  4,  7,  1, -1 },
        {  9,  7,  3,  5,  4 }
#else
		error
#endif
    };
	GaussElimination(a);
}
この回答を放置しないで、何らかの返信をお願いします。
例えば、N が 3 の場合、4 の場合、5 の場合の実行結果を書いてください。
そして、疑問点があれば質問してください。

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#5

投稿記事 by carnage0216 » 5年前

ご迷惑おかけして申し訳ありません。
はい、返信させていただきます。
Nは3のままで実行させていただきました。
以下が結果です。
+5.000000 x1 -1.000000 x2 -1.000000 x3 = +0.000000
+2.000000 x1 +1.000000 x2 -3.000000 x3 = -5.000000
+1.000000 x1 +1.000000 x2 +1.000000 x3 = +6.000000
x1 = 1.000000
x2 = 2.000000
x3 = 3.000000

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#6

投稿記事 by carnage0216 » 5年前

今回の質問の後退代入に関して疑問があります。
実は自分でも一から作ってみようを試行錯誤しているのですがうまくいかず困り果てています。
b[2]=a[2][3]/a[2][2]



b[1]=a[1][3]/a[1][1]-a[1][2]/a[1][1]×b[2]



b[0]=a[0][3]/a[0][0]-a[0][1]/a[0][0]×b[1]-a[0][2]/a[0][0]×b[2]



#define N 3 とfor(i= N-1;i>=0;i++)より

b=a[N]/a



b=a[N]/a-a[i+1]/a[i]×b[i+1]



b[i]=a[i][N]/a[i][i]-a[i][i+1]/a[i][i]×b[i+1]-a[i][i+2]/a[i][i]×b[i+2]

から共通部分をfor文でまとめると

for(i=N-1;i>=0;i++){b[i]=a[i][N]/a[i][i];}としました。

残った部分の

b[i]=1

b[i]=-a[i][i+1]×b[i+1]

b[i]=-a[i][i+1]×b[i+1]-a[i][i+2]×b[i+2]

をどの様にforでまとめるか大変悩んでいます。

j=i+1でまとめようと考えたのですが、

b[i]=1があるためどうしていいのか途方に暮れています。

どうか知恵を貸して頂けないでしょうか?
もし私の解き方というかやり方が間違っている場合、どのようにfor文でまとめていくかの過程を踏まえてどうか詳しく教えていただけないでしょうか?
どうかよろしくお願いいたします。

かずま

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#7

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

carnage0216 さんが書きました:
5年前
#define N 3 とfor(i= N-1;i>=0;i++)より

b=a[N]/a



b=a[N]/a-a[i+1]/a[i]×b[i+1]



b[i]=a[i][N]/a[i][i]-a[i][i+1]/a[i][i]×b[i+1]-a[i][i+2]/a[i][i]×b[i+2]

どのようにしてプログラムを書いたのか。に書いた

コード:

[i] と書くと、イタリック体タグと解釈されて、
[i] は表示されず、以後、半角文字がすべて斜体になります。
[i] を表示したければ、御覧のように codeタグを使うなどの工夫が必要です。
を無視しているから、変なことになっています。
返信前には、プレビューで表示がどうなっているか確認しましょう。
それから、空行を 3行も入れるのはどういう理由からでしょうか?

さて、N = 3 の場合、後退代入を次のようにすることは間違いではありません。

コード:

	double b[N];                          // 後退代入
	b[2] = a[2][3]/a[2][2];
	b[1] = a[1][3]/a[1][1] - a[1][2]/a[1][1]*b[2];
	b[0] = a[0][3]/a[0][0] - a[0][1]/a[0][0]*b[1] - a[0][2]/a[0][0]*b[2];
    for (int k = 0; k < N; k++)           // 結果出力
        printf("x%d = %f\n", k + 1, b[k]);
これは、次のようになります。(結果出力の部分は省略)

コード:

	double b[N];
	int i;
	i = 2;
	b[i] = a[i][N]/a[i][i];
	i = 1;
	b[i] = a[i][N]/a[i][i] - a[i][i+1]/a[i][i]*b[i+1];
	i = 0;
	b[i] = a[i][N]/a[i][i] - a[i][i+1]/a[i][i]*b[i+1] - a[i][i+2]/a[i][i]*b[i+2];
共通でない部分(引き算をする項の部分)は個数が変わるので、
新たな変数 j を使って for文にする必要があります。

コード:

	double b[N];
	for (int i = N - 1; i >= 0; i--) {
		b[i] = a[i][N]/a[i][i];            // 共通部分
		for (int j = i + 1; j < N; j++)    // 共通でない部分
			b[i] -= a[i][j]/a[i][i]*b[j];
	}
i = N - 1 の場合、j は N から始まるので、
j < N を満足せずループをすぐに抜けます。
carnage0216 さんが書きました:
5年前

コード:

残った部分の

b[i]=1

b[i]=-a[i][i+1]×b[i+1]

b[i]=-a[i][i+1]×b[i+1]-a[i][i+2]×b[i+2]

をどの様にforでまとめるか大変悩んでいます。

j=i+1でまとめようと考えたのですが、
b[i]=1があるためどうしていいのか途方に暮れています。

コード:

b[i]=1 ではありません。
なぜ 1 が突然出てくるんですか?
i = 2 の場合、引くものはありません。
強いて書けば、b[i] -= 0 です。

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#8

投稿記事 by carnage0216 » 5年前

どうもありがとうございます。おっしゃる通り1ではなく0です。
私のミスです。
>>返信前には、プレビューで表示がどうなっているか確認しましょう。
わかりました。
>>それから、空行を 3行も入れるのはどういう理由からでしょうか?
見やすいようにと思ったのですが、変な文になってしまうのでやめます。
>>i = N - 1 の場合、j は N から始まるので、
j < N を満足せずループをすぐに抜けます。
ということは多元線形方程式に対応したプログラムではないということでしょうか?

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#9

投稿記事 by carnage0216 » 5年前

b[2]=a[2][3]/a[2][2]
b[1]=a[1][3]/a[1][1]-a[1][2]/a[1][1]×b[2]
b[0]=a[0][3]/a[0][0]-a[0][1]/a[0][0]×b[1]-a[0][2]/a[0][0]×b[2]
に関して
b=a[N]/a
b=a[N]/a-a[i+1]/a[i]×b[i+1]
b[i]=a[i][N]/a[i][i]-a[i][i+1]/a[i][i]×b[i+1]-a[i][i+2]/a[i][i]×b[i+2]
と置きます。
ここでfor(i=N-1;i>=0;i++){b[i]=a[i][i];}とした後の
b[i]=a[i][N]
b[i]=a[i][N]-a[i][i+1]×b[i+1]
b[i]=a[i][N]-a[i][i+1]×b[i+1]-a[i][i+2]×b[i+2]
の部分を
こちらのサイトに書いてあるhttps://www.mk-mode.com/octopress/2013/09/24/cp ... imination/

// 後退代入
for (i = N - 1; i >= 0; i--) {
d = a[i][N];
for (j = i + 1; j < N; j++)
d -= a[i][j] * a[j][N];
a[i][N] = d / a[i][i];
}
のプログラムの
for (j = i + 1; j < N; j++)
d -= a[i][j] * a[j][N];
a[i][N] = d / a[i][i];
の部分にしたいのですが、どうのように導けばよいのか、ここで詰んでいます。
どうか
b[i]=a[i][N]
b[i]=a[i][N]-a[i][i+1]×b[i+1]
b[i]=a[i][N]-a[i][i+1]×b[i+1]-a[i][i+2]×b[i+2]
から
for (j = i + 1; j < N; j++)
d -= a[i][j] * a[j][N];
a[i][N] = d / a[i][i];
を作る過程を書いていただけないでしょうか?

かずま

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#10

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

コード:

何度言ったらわかるんですか?
[i] を書きたかったら、codeタグを使ってください。
プレビューを見ていますか?

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#11

投稿記事 by carnage0216 » 5年前

本当に申し訳ありません。
ひとつ前のものに不備があり編集いたしました。
carnage0216 さんが書きました:
5年前

コード:

b[2]=a[2][3]/a[2][2]
b[1]=a[1][3]/a[1][1]-a[1][2]/a[1][1]×b[2]
b[0]=a[0][3]/a[0][0]-a[0][1]/a[0][0]×b[1]-a[0][2]/a[0][0]×b[2]
に関して

コード:

b[i]=a[i][N]/a[i][i]
b[i]=a[i][N]/a[i][i]-a[i][i+1]/a[i][i]×b[i+1]
b[i]=a[i][N]/a[i][i]-a[i][i+1]/a[i][i]×b[i+1]-a[i][i+2]/a[i][i]×b[i+2]
と置きます。
ここで

コード:

for(i=N-1;i>=0;i++){b[i]=a[i][i];}
とした後の

コード:

b[i]=a[i][N]
b[i]=a[i][N]-a[i][i+1]×b[i+1]
b[i]=a[i][N]-a[i][i+1]×b[i+1]-a[i][i+2]×b[i+2]
の部分を
こちらのサイトに書いてあるhttps://www.mk-mode.com/octopress/2013/ ... imination/

// 後退代入

コード:

for (i = N - 1; i >= 0; i--) {
        d = a[i][N];
        for (j = i + 1; j < N; j++)
            d -= a[i][j] * a[j][N];
        a[i][N] = d / a[i][i];
    }
のプログラムの

コード:

for (j = i + 1; j < N; j++)
            d -= a[i][j] * a[j][N];
        a[i][N] = d / a[i][i];
の部分にしたいのですが、どうのように導けばよいのか、ここで詰んでいます。
どうか

コード:

b[i]=a[i][N]
b[i]=a[i][N]-a[i][i+1]×b[i+1]
b[i]=a[i][N]-a[i][i+1]×b[i+1]-a[i][i+2]×b[i+2]
から

コード:

for (j = i + 1; j < N; j++)
            d -= a[i][j] * a[j][N];
        a[i][N] = d / a[i][i];
を作る過程を書いていただけないでしょうか?

かずま

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#12

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

carnage0216 さんが書きました:
5年前

コード:

b[2]=a[2][3]/a[2][2]
b[1]=a[1][3]/a[1][1]-a[1][2]/a[1][1]×b[2]
b[0]=a[0][3]/a[0][0]-a[0][1]/a[0][0]×b[1]-a[0][2]/a[0][0]×b[2]
に関して

コード:

b[i]=a[i][N]/a[i][i]
b[i]=a[i][N]/a[i][i]-a[i][i+1]/a[i][i]×b[i+1]
b[i]=a[i][N]/a[i][i]-a[i][i+1]/a[i][i]×b[i+1]-a[i][i+2]/a[i][i]×b[i+2]
と置きます。

コード:

すべての項を a[i][i] で割ってから引き算をするのなら、
先に項の引き算だけをやって、最後に割ればよいでしょう。

b[i] = a[i][N] / a[i][i];
b[i] = (a[i][N] - a[i][i+1]*b[i+1]) / a[i][i]:
b[i] = (a[i][N] - a[i][i+1]*b[i+1] - a[i][i+2]*b[i+2]) / a[i][i];

コード:

for文で書くと、

	for (int i = N - 1; i >= 0; i--) {
		b[i] = a[i][N];
		for (int j = i + 1; j < N; j++)
			b[i] -= a[i][j] * b[j];
		b[i] /= a[i][i];
	}

コード:

結果は、b[i] に入れずに、a[i][N] に入れてよいでしょう。

	for (int i = N - 1; i >= 0; i--) {
		a[i][N] = a[i][N];
		for (int j = i + 1; j < N; j++)
			a[i][N] -= a[i][j] * a[j][N];
		a[i][N] /= a[i][i];
	}

コード:

for文の中で j に無関係な a[i][N] に何度もアクセスするのは
好ましくないので、一時変数 d を用意すると、

	for (int i = N - 1; i >= 0; i--) {
		d = a[i][N];
		for (int j = i + 1; j < N; j++)
			d -= a[i][j] * a[j][N];
		a[i][N] = d / a[i][i];
	}

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#13

投稿記事 by carnage0216 » 5年前

かずまさん。どうもありがとうございます。
かずまさんの解説のおかげでやっと少しずつ理解できてきました。
ただ一つだけ、なぜ

コード:

b[i]

コード:

a[i][N]
が入るのか疑問です。
あと、行うわけではないのですが、別に

コード:

for(int i=0;i<=3;i++){printf("%d",b[i])};
などと書いてもちゃんとした答えは出るのでしょうか?
それとも載せていただいたプログラム

コード:

for (int i = N - 1; i >= 0; i--) {
		d = a[i][N];
		for (int j = i + 1; j < N; j++)
			d -= a[i][j] * a[j][N];
		a[i][N] = d / a[i][i];
	}
のように、ここまでする必要はあるのかなと、素人の私では至らないですが、少し考えることがありました。普通にb ではダメなのかなと思っていましました。
なんか脱線してしまっているかもしれませんが。どうかよろしくお願いいたします。
また、少し返信が遅くなるかもしれませんが、決して無視しているわけではないので今後も何卒宜しくお願い致します。

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#14

投稿記事 by carnage0216 » 5年前

もう一つすいません。

コード:

for (int i = N - 1; i >= 0; i--) {
		d = a[i][N];
		for (int j = i + 1; j < N; j++)
			d -= a[i][j] * a[j][N];
		a[i][N] = d / a[i][i];
	}
のプログラムは

コード:

for (int i = N - 1; i >= 0; i--) {
		d = a[i][N];
		for (int j = i + 1; j < N; j++)
			
		a[i][N] = d-a[i][j] * a[j][N] / a[i][i];
	}
と書くと出力結果が違ったのですが、なぜでしょうか?

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

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#15

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

carnage0216 さんが書きました:
5年前
もう一つすいません。

コード:

for (int i = N - 1; i >= 0; i--) {
		d = a[i][N];
		for (int j = i + 1; j < N; j++)
			d -= a[i][j] * a[j][N];
		a[i][N] = d / a[i][i];
	}
のプログラムは

コード:

for (int i = N - 1; i >= 0; i--) {
		d = a[i][N];
		for (int j = i + 1; j < N; j++)
			
		a[i][N] = d-a[i][j] * a[j][N] / a[i][i];
	}
と書くと出力結果が違ったのですが、なぜでしょうか?
なぜと聞く前に自身でなぜ確認されないんですか?

コード:

for (int i = N - 1; i >= 0; i--) {
	d = a[i][N];
	for (int j = i + 1; j < N; j++) {
		d -= a[i][j] * a[j][N];
	}
	printf("(i)%d, %d\n", i, d);
	a[i][N] = d / a[i][i];
}

コード:

for (int i = N - 1; i >= 0; i--) {
	d = a[i][N];
	printf("(i)%d, %d\n", i, d);
	
	for (int j = i + 1; j < N; j++) {
		a[i][N] = d-a[i][j] * a[j][N] / a[i][i];
	}
}

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#16

投稿記事 by carnage0216 » 5年前

>>なぜと聞く前に自身でなぜ確認されないんですか?
プログラム全体までを作る技量がないのと、かずまさんのような方のプログラムを真似たいと思い確認せずに質問しました。今後は考えてもわからない、そして自分なりに書いてから質問します。
本当に不快にさせることばかりして申し訳ありませんでした。

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#17

投稿記事 by carnage0216 » 5年前

すいません。
お聞きしたいのですが、なぜ

コード:

b[i]

コード:

a[i][N]
が入るのか疑問です。

プログラムに

コード:

b[i]=a[i][N]
と書いてあったのですが、

コード:

b[i]=a[i][N]
であるため置き換えられたということでしょうか?

carnage0216
記事: 20
登録日時: 6年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#18

投稿記事 by carnage0216 » 5年前

先ほどコードをビルドしました。
やはり異なった結果になります。
あの厚手がましいかもしれませんが、少し間違いがあったので直したのを載せさせていただきます。

コード:

for (int i = N - 1; i >= 0; i--) {
	d = a[i][N];
	for (int j = i + 1; j < N; j++) {
		d -= a[i][j] * a[j][N];
	}
	printf("(i)%d, %d\n", i, d);
	a[i][N] = d / a[i][i];
}
改善↓

コード:

for (int i = N - 1; i >= 0; i--) {
	d = a[i][N];
	for (int j = i + 1; j < N; j++) {
		d -= a[i][j] * a[j][N];
	}
	printf("(i)%d, %f\n", i, d);
	a[i][N] = d / a[i][i];
}

コード:

for (int i = N - 1; i >= 0; i--) {
	d = a[i][N];
	printf("(i)%d, %d\n", i, d);
	
	for (int j = i + 1; j < N; j++) {
		a[i][N] = d-a[i][j] * a[j][N] / a[i][i];
	}
}
改善↓

コード:

for (int i = N - 1; i >= 0; i--) {
	d = a[i][N];
	printf("(i)%d, %f\n", i, d);
	
	for (int j = i + 1; j < N; j++) {
		a[i][N] = d-a[i][j] * a[j][N] / a[i][i];
	}
}

かずま

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#19

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

double a[N][N+1]; と double a[N][N], b[N]; は同じです。

double a[N][N+1]; を使ったコード

コード:

#include <stdio.h> 

#define N 3

void GaussElimination(double a[N][N+1])
{
    for (int i = 0; i < N; i++) {         // 元の連立方程式を出力
        for (int j = 0; j < N; j++)
            printf("%+f x%d ", a[i][j], j + 1);
        printf("= %+f\n", a[i][N]);
    }
    for (int k = 0; k < N -1; k++) {      // 前進消去
        for (int i = k + 1; i < N; i++) {
            double d = a[i][k] / a[k][k];
            for (int j = k + 1; j <= N; j++)
                a[i][j] -= a[k][j] * d;
        }
    }
    for (int i = N - 1; i >= 0; i--) {    // 後退代入
        for (int j = i + 1; j < N; j++)
            a[i][N] -= a[i][j] * a[j][N];
        a[i][N] /= a[i][i];
    }
    for (int k = 0; k < N; k++)           // 結果出力
        printf("x%d = %f\n", k + 1, a[k][N]);
}

int main(void)
{
    static double a[N][N + 1] = {
        { 5, -1, -1,  0 },
        { 2,  1, -3, -5 },
        { 1,  1,  1,  6 }
    };
    GaussElimination(a);
}
double a[N][N], b[N]; を使ったコード (★の行が異なる)

コード:

#include <stdio.h> 

#define N 3

void GaussElimination(double a[N][N], double b[N])  // ★
{
    for (int i = 0; i < N; i++) {         // 元の連立方程式を出力
        for (int j = 0; j < N; j++)
            printf("%+f x%d ", a[i][j], j + 1);
        printf("= %+f\n", b[i]);             // ★
    }
    for (int k = 0; k < N -1; k++) {      // 前進消去
        for (int i = k + 1; i < N; i++) {
            double d = a[i][k] / a[k][k];
            for (int j = k + 1; j < N; j++)  // ★
                a[i][j] -= a[k][j] * d;
            b[i] -= b[k] * d;                // ★
        }
    }
    for (int i = N - 1; i >= 0; i--) {    // 後退代入
        for (int j = i + 1; j < N; j++)
            b[i] -= a[i][j] * b[j];          // ★
        b[i] /= a[i][i];                     // ★
    }
    for (int k = 0; k < N; k++)           // 結果出力
        printf("x%d = %f\n", k + 1, b[k]);   // ★
}

int main(void)
{
    static double a[N][N] = {
        { 5, -1, -1 },
        { 2,  1, -3 },
        { 1,  1,  1 }
    };
    static double b[N] = { 0, -5, 6 };
    GaussElimination(a, b);
}

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

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#20

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

carnage0216 さんが書きました:
5年前
先ほどコードをビルドしました。
やはり異なった結果になります。
あの厚手がましいかもしれませんが、少し間違いがあったので直したのを載せさせていただきます。
ガウスの後退代入の二重ループに関する質問です。(※ガウスはあんまり関係ありません。二重ループがメインです。)
で、上記投稿サイトでも解説をなさっている回答者がついているわけだが。
ループ処理なり変数なり修正するのは作成者(ここではcarnage0216さん)の自由(ライセンスの範囲であれば)ですが

コード:

for (i = N - 1; i >= 0; i--) {
        d = a[i][N];
        for (j = i + 1; j < N; j++)
            d -= a[i][j] * a[j][N];
        a[i][N] = d / a[i][i];
    }
では

コード:

a[i][N] = d / a[i][i];
の前に変数dがループ処理によって変化する可能性があるのに
そこもすっとぱして

コード:

for (int i = N - 1; i >= 0; i--) {
	d = a[i][N];
	
	for (int j = i + 1; j < N; j++) {
		a[i][N] = d-a[i][j] * a[j][N] / a[i][i];
	}
}
変数dには何も変化させずに計算ぶっこみ。
コードは書いたとおりにしか動かないわけだが
結局、なにがしたいんですか。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 連立方程式を解くプログラムを多元線形連立方程式にするには

#21

投稿記事 by usao » 5年前

(同一人物なのか,たまたまタイムリーに並列的に存在しただけなのか定かではないですが)
「for」に関してこちらのトピック等を参考にすべきでしょう.
viewtopic.php?f=3&t=20298

返信

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