#include <stdio.h>
#include <math.h>
void swap(int n, double A[][100], double b[], int r, int k);
void Eliminate(int n, double A[][100], double b[]);
void Substitude(int n, double A[][100], double b[], double x[]);
int main() {
int n;
double A[100][100]={}, b[100]={}, x[100]={};
scanf("%d", &n);
for (int i=0; i < n; i ++) {
for (int j=0; j < n; j ++) {
scanf("%lf", &A[i][j]);
}
scanf("%lf", &b[i]);
}
Eliminate(n, A, b);
Substitude(n, A, b, x);
for (int w=0; w<n; w++) {
printf("%lf ", x[w]);
}
}
void swap(int n, double A[][100], double b[], int r, int k){
double tempa, tempb;
for (int i=0; i<n; i++) {
tempa = A[r][i];
A[r][i] = A[k][i];
A[k][i] = tempa;
}
tempb = b[r];
b[r] = b[k];
b[k] = tempb;
}
void Eliminate(int n, double A[][100], double b[]){
for(int k = 0; k < n-1; k++){
int index = k;
double max = A[k][k];
for (int j=k; j < n; j++) {
if (A[j][k] > max) {
max = A[j][k];
index = j;
}
}
if (k != index)
swap(n, A, b, k, index);
b[k] = b[k] / A[k][k];
for (int u=n-1; u > -1;u --) {
A[k][u] = A[k][u] / A[k][k];
}
for (int t=k+1; t<n; t++) {
for (int y=k+1; y<n; y++) {
A[t][y] -= A[k][y] * A[t][k];
}
b[t] -= b[k] * A[t][k];
}
for (int q=k+1; q<n; q++) {
A[q][k] = 0;
}
}
}
void Substitude(int n, double A[][100], double b[], double x[]){
for (int r=n; r>=0; r--) {
double wch=0;
for (int e=r; e<n; e++) {
wch += A[r][e] * x[e];
}
x[r] = (b[r] - wch) / A[r][r];
}
}
列主元消元法
于 2023-03-01 15:42:23 首次发布