#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);
}
double a[N][N+1]; と double a[N][N], b[N]; は同じです。
double a[N][N+1]; を使ったコード
[code]
#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);
}
[/code]
double a[N][N], b[N]; を使ったコード (★の行が異なる)
[code]
#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);
}
[/code]