Advertisement
Finnit

Escalonador de Sistemas Lineares

Jun 30th, 2025
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.10 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define DEBUG 0
  5.  
  6. void swap(double *s, int M, int N, int i, int l) {
  7.     double t;
  8.     for(int j = 0; j < N; ++j) {
  9.         t = s[i*N+j];
  10.         s[i*N+j] = s[l*N+j];
  11.         s[l*N+j] = t;
  12.     }
  13. }
  14.  
  15. int non0pivot(double *s, int M, int N, int i, int j) {
  16.     for(int i = 0; i < N; ++i)
  17.         if(s[i*N+j] != 0)
  18.             return i;
  19.     return -1;
  20. }
  21.  
  22. void readS(FILE *in, double **s, int *M, int *N) {
  23.     int x;
  24.     x = fscanf(in,"%d",M);
  25.     *N = *M+1;
  26.     #if DEBUG
  27.     printf("%d %d\n",*M,*N);
  28.     #endif
  29.     *s = calloc((*M)*(*N),sizeof(double));
  30.     for(int i = 0; i < *M**N; ++i) {
  31.         #if DEBUG
  32.         printf("i: %d\n",i);
  33.         #endif
  34.         x = fscanf(in,"%lf",&((*s)[i]));
  35.     }  
  36. }
  37.  
  38. void printS(FILE *out, double *s, int M, int N) {
  39.     for(int i = 0; i < M; ++i) {
  40.         for(int j = 0; j < N; ++j) {
  41.             if(s[i*N+j] >= 0) {
  42.                 printf(" ");
  43.                 fprintf(out," ");
  44.             }
  45.             printf("%.3lf ",s[i*N+j]);
  46.             fprintf(out,"%.3lf ",s[i*N+j]);
  47.         }
  48.         putchar('\n');
  49.     }
  50.     putchar('\n');
  51. }
  52.  
  53. void mult(double *s, double *x, double *c, int M, int N) {
  54.     for(int i = 0; i < M; ++i)
  55.         for(int j = 0; j < N-1; ++j)
  56.             for(int k = 0; k < M; ++k)
  57.                 c[k] += s[i*N+k]*x[k];
  58. }
  59.  
  60. int main(int argc, char **argv) {
  61.     if(argc != 3)
  62.         return -1;
  63.     FILE *in = fopen(argv[1],"r");
  64.     FILE *out = fopen(argv[2],"w");
  65.  
  66.     int M, N;
  67.     double *s;
  68.  
  69.     readS(in,&s,&M,&N);
  70.     printS(out,s,M,N);
  71.  
  72.     double *x = calloc(M,sizeof(double));
  73.     double *b = calloc(M,sizeof(double));
  74.     double *c = calloc(M,sizeof(double));
  75.  
  76.     #if DEBUG
  77.     printf("linha: %d\n",__LINE__);
  78.     #endif
  79.     for(int i = 0, j = 0; i < M; ++i, ++j) {
  80.         #if DEBUG
  81.         printf("linha: %d, i = %d\n",__LINE__,i);
  82.         #endif
  83.         if(s[i*N+j] == 0) {
  84.             #if DEBUG
  85.             printf("linha: %d, i = %d\n",__LINE__,i);
  86.             #endif
  87.             int l = non0pivot(s,M,N,i+1,j);
  88.             if(l == -1) {
  89.                 ++j;
  90.                 break;
  91.             }
  92.             swap(s,M,N,i,l);
  93.         }
  94.         #if DEBUG
  95.         printf("linha: %d, i = %d\n",__LINE__,i);
  96.         #endif
  97.         for(int k = 0; k < M; ++k) {
  98.             if(i == k)
  99.                 continue;
  100.             register double x = s[k*N+j]/s[i*N+j];
  101.             s[k*N+i] = 0.;
  102.             for(int h = i+1; h < N; ++h)
  103.                 s[k*N+h] -= x*s[i*N+h];
  104.         }
  105.         printS(out,s,M,N);
  106.     }
  107.  
  108.     for(int i = 0, j = 0; i < M; ++i, ++j) {
  109.         if(s[i*N+j] == 0) {
  110.             ++j;
  111.             continue;
  112.         }
  113.         register double x = s[i*N+j];
  114.         for(int k = j; k < N; ++k)
  115.             s[i*N+k] = s[i*N+k]/x;
  116.     }
  117.     printS(out,s,M,N);
  118.  
  119.     for(int i = 0, j = 0; i < M; ++i, ++j) {
  120.         if(s[i*N+j] == 0) {
  121.             ++j;
  122.             continue;
  123.         }
  124.         x[i] = s[i*N+j];
  125.         b[i] = s[i*N+N-1];
  126.     }
  127.  
  128.     mult(s,x,c,M,N);
  129.     for(int i = 0; i < M; ++i)
  130.         printf("err(%d): %lf\n", i, b[i]-c[i]);
  131. }
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement