#include <stdio.h>
#include <math.h>
#define N 33
#define EPSILON 1.0e-16
/* net-descripting */
struct table {
double imm;
int net[4];
} table[N] = {
{ 0, { -1, -1, 1, 7 }}, /* 0 */
{ 0, { 0, -1, 2, 8 }}, /* 1 */
{ 0, { 1, -1, 3, 9 }}, /* 2 */
{ 0, { 2, -1, 4, 10 }}, /* 3 */
{ 0, { 3, -1, 5, 11 }}, /* 4 */
{ 0, { 4, -1, 6, 12 }}, /* 5 */
{ 0, { 5, -1, 13, -1 }}, /* 6 */
{ 0, { 0, -1, 8, 14 }}, /* 7 */
{ 0, { 1, 7, 9, 15 }}, /* 8 */
{ 0, { 2, 8, 10, 16 }}, /* 9 */
{ 0, { 3, 9, 11, 17 }}, /* 10 */
{ 0, { 4, 10, 12, 18 }}, /* 11 */
{ 0, { 5, 11, 13, 19 }}, /* 12 */
{ 0, { 6, 12, 20, -1 }}, /* 13 */
{ 0, { 7, -1, 15, 21 }}, /* 14 */
{ 0, { 8, 14, 16, 22 }}, /* 15 */
{ 0, { 9, 15, 17, 23 }}, /* 16 */
{ 0, { 10,16, 18, -1 }}, /* 17 */
{ 0, { 11,17, 19, 24 }}, /* 18 */
{ 0, { 12,18, 20, 25 }}, /* 19 */
{ 0, { 13,19, 26, -1 }}, /* 20 */
{ 0, { 14,-1, 22, 31 }}, /* 21 */
{ 0, { 15,21, 23, 27 }}, /* 22 */
{ 0, { 16,22, 28, -1 }}, /* 23 */
{ 0, { 18,-1, 25, 29 }}, /* 24 */
{ 0, { 19,24, 26, 30 }}, /* 25 */
{ 0, { 20,25, 32, -1 }}, /* 26 */
{ 0, { 31,22, 28, -1 }}, /* 27 */
{ 0, { 23,27, -1, -1 }}, /* 28 */
{ 0, { 24,-1, 30, -1 }}, /* 29 */
{ 0, { 25,29, 32, -1 }}, /* 30 */
{ 5.0, { -1, -1, -1, -1 }}, /* 31 */ /* = 5.0V */
{ 0.0, { -1, -1, -1, -1 }} /* 32 */ /* = 0.0V */
};
/* Guss-Jordan */
int main() {
int i, j, k, x, y;
double r, max;
double a[N][N + 1];
/* net-equation constucting */
for (i = 0; i < N; i++) {
for (j = 0; j < N + 1; j++)
a[i][j] = 0.0;
if (table[i].net[0] == -1 && table[i].net[1] == -1 && table[i].net[2] == -1 && table[i].net[3] == -1) {
a[i][i] = 1.0;
a[i][N] = table[i].imm;
} else {
k = 0;
for (j = 0; j < 4; j++)
if (!(table[i].net[j] < 0))
k++;
a[i][i] = (double)(-k);
for (j = 0; j < 4; j++)
if (!(table[i].net[j] < 0))
a[i][table[i].net[j]] = (double)1.0;
}
}
printf("net-equation constructed\n");
for (y = 0; y < N; y++) {
for (x = 0; x <= N; x++)
printf("%+.2f ", a[y][x]);
putchar('\n');
}
putchar('\n');
/* forward */
for (i = 0; i < N; i++) {
/* pivotting */
max = fabs(a[i][i]);
k = i;
for (j = i + 1; j < N; j++)
if (max < fabs(a[j][i])) {
max = fabs(a[j][i]);
k = j;
}
if (k != i)
for (j = 0; j <= N; j++) {
r = a[k][j];
a[k][j] = a[i][j];
a[i][j] = r;
}
/* pivotting finished */
r = a[i][i];
for (j = i ; j <= N; j++)
a[i][j] /= r;
for (j = i + 1; j < N; j++) {
r = a[j][i];
if (fabs(r) > EPSILON) {
for (k = 0; k <= N; k++) {
a[j][k] /= r;
a[j][k] -= a[i][k];
}
}
}
#if 0
printf("1step forward\n");
for (y = 0; y < N; y++) {
for (x = 0; x <= N; x++)
printf("%+.2f ", a[y][x]);
putchar('\n');
}
putchar('\n');
#endif
}
/* backward */
for (i = N - 1; i >= 0; i--) {
for (j = i - 1; j >= 0; j--) {
a[j][N] -= a[i][N] * a[j][i];
a[j][i] = 0.0;
}
}
for (y = 0; y < N; y++)
printf("%d: %.6f\n", y, a[y][N]);
putchar('\n');
return 0;
}
/* end */