プロが教えるわが家の防犯対策術!

#include <iostream>
#include <stdio.h>

#define N 3

double A[N][N] = {
{ 1.0, 2.0, 8.0 },
{ 4.0, 3.0, 2.0 },
{ 1.0, 4.0, 2.0 },
};

double b[N] = { 4.0, 12.0, 4.0 };

#define N 3

void solve(double A[N][N], double b[N]) {

}

int main() {

//(2)-(1)* A[0][0] / A[0][0]
A[1][1] = A[1][1] - A[0][1] * A[1][0] / A[0][0];
printf("過程の計算でのA[1][1]は%f\n", A[1][1]);

A[1][2] = A[1][2] - A[0][2] * A[1][0] / A[0][0];
printf("過程の計算でのA[1][2]は%f\n", A[1][2]);

b[1] = b[1] - b[0] * A[1][0] / A[0][0];
printf("過程の計算でのb[1]は%f\n", b[1]);

//(3)-(1) * A[2][0] / A[0][0]
A[2][1] = A[2][1] - A[0][1] * A[2][0] / A[0][0];
printf("過程の計算でのA[2][1]は%f\n", A[2][1]);

A[2][2] = A[2][2] - A[0][2] * A[2][0] / A[0][0];
printf("過程の計算でのA[2][2]は%f\n", A[2][2]);

b[2] = b[2] - b[0] * A[2][0] / A[0][0];
printf("過程の計算でのb[2]は%f\n", b[2]);

//(3)'-(2)' * A[2][1] / A[1][1]
A[2][2] = A[2][2] - A[1][2] * A[2][1] / A[1][1];
printf("過程の計算でのA[2][2]は%f\n", A[2][2]);

b[2] = b[2] - b[1] * A[2][1] / A[1][1];
printf("過程の計算でのb[2]は%f\n", b[2]);

//変数x2の係数が1の時のb[2]に入る数字が変数x2の解となるため。
b[2] = b[2] / A[2][2];
printf("b[2]は%f\n", b[2]);

//変数x1の係数が1の時のb[1]に入る数字が変数x1の解となるため。
b[1] = (b[1] - A[1][2] * b[2]) / A[1][1];
printf("b[1]は%f\n", b[1]);

//変数x2の係数が1の時のb[2]に入る数字が変数x2の解となるため。
b[0] = (b[0] - A[0][2] * b[2] - A[0][1] * b[1]) / A[0][0];
printf("b[0]は%f\n", b[0]);

for (int k = 0; k < 3; k++) {

printf("b[%d]はb[%d] = %fである\n",k, k, b[k]);
}

return 0;

}
のプログラムは連立方程式を解くプログラムです。一から作りました。
以上のプログラムの

//(2)-(1)* A[0][0] / A[0][0]
A[1][1] = A[1][1] - A[0][1] * A[1][0] / A[0][0];
printf("過程の計算でのA[1][1]は%f\n", A[1][1]);

A[1][2] = A[1][2] - A[0][2] * A[1][0] / A[0][0];
printf("過程の計算でのA[1][2]は%f\n", A[1][2]);

b[1] = b[1] - b[0] * A[1][0] / A[0][0];
printf("過程の計算でのb[1]は%f\n", b[1]);

//(3)-(1) * A[2][0] / A[0][0]
A[2][1] = A[2][1] - A[0][1] * A[2][0] / A[0][0];
printf("過程の計算でのA[2][1]は%f\n", A[2][1]);

A[2][2] = A[2][2] - A[0][2] * A[2][0] / A[0][0];
printf("過程の計算でのA[2][2]は%f\n", A[2][2]);

b[2] = b[2] - b[0] * A[2][0] / A[0][0];
printf("過程の計算でのb[2]は%f\n", b[2]);

//(3)'-(2)' * A[2][1] / A[1][1]
A[2][2] = A[2][2] - A[1][2] * A[2][1] / A[1][1];
printf("過程の計算でのA[2][2]は%f\n", A[2][2]);

b[2] = b[2] - b[1] * A[2][1] / A[1][1];
printf("過程の計算でのb[2]は%f\n", b[2]);

の部分をfor文を用いて改良してNの数字が変数であっても解が導けるように改良したいのですが、どうすれば良いでしょうか?

A 回答 (3件)

「お金を積んでだれかに頼む」のがベストじゃないかなぁ.

    • good
    • 2

>改良したいのですが、どうすれば良いでしょうか?


ここで質問せずに、
 プログラミングやアルゴリズムの勉強をする
でしょうか。

勉強も、
 人に聞いて答えを出す
のではなく
 自分で考えて、プログラミングして、コンピュータに入力してエラーメッセージをたくさん出して、「なぜ動かない」「どこが悪いのだろう」と自問自答して何時間も何日も、何か月も何年も悩む
こと、お勧めします。
    • good
    • 1

結局最初の質問に戻って



// 前進消去
for (k = 0; k < N -1; k++) {
for (i = k + 1; i < N; i++) {
d = a[i][k] / a[k][k];
for (j = k + 1; j <= N; j++)
a[i][j] -= a[k][j] * d;
}
}

// 後退代入
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 (k = 0; k < N -1; k++) {
for (i = k + 1; i < N; i++) {
d = a[i][k] / a[k][k];
for (j = k + 1; j < N; j++)
a[i][j] -= a[k][j] * d;

b[i] -= b[k]*d;
}
}

// 後退代入
for (i = N - 1; i >= 0; i--) {
d = b[i];
for (j = i + 1; j < N; j++)
d -= a[i][j] * b[j];
b[i] = d / a[i][i];
}

ピボッティングしてないから
実用性は無いことに注意。

この処理自体、Nが定数か変数かは
関係無い。配列a、bの作り方次第で
Nは可変にできます。

http://tondol.hatenablog.jp/entry/20090713/12474 …
    • good
    • 0
この回答へのお礼

配列a,bの作り方次第で可変出来るとは知りませんでした。
for文を使えば可変出来ると思っていました。
どうもありがとうございます。

お礼日時:2018/08/14 06:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!