Advertisement
NyanCoder

Seidel.c

Apr 18th, 2022
884
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.34 KB | None | 0 0
  1. #include "stdlib.h"
  2. #include "stdio.h"
  3. #include "math.h"
  4.  
  5. float* seidel(int size, float** A, float eps)
  6. {
  7.     float* x = (float*)malloc(sizeof(float) * size);
  8.     for (int i = 0; i < size; i++)
  9.         x[i] = 0;
  10.     char converge = 0;
  11.     while (!converge)
  12.     {
  13.         float* x_new = (float*)malloc(sizeof(float) * size);
  14.         for (int i = 0; i < size; i++)
  15.             x_new[i] = x[i];
  16.  
  17.         for (int i = 0; i < size; i++)
  18.         {
  19.             float s1 = 0, s2 = 0;
  20.             for (int j = 0; j < i; j++)
  21.                 s1 += A[i][j] * x_new[j];
  22.             for (int j = i + 1; j < size; j++)
  23.                 s2 += A[i][j] * x[j];
  24.             x_new[i] = (A[i][size] - s1 - s2) / A[i][i];
  25.         }
  26.  
  27.         float sum = 0;
  28.         for (int i = 0; i < size; i++)
  29.             sum += (x_new[i] - x[i]) * (x_new[i] - x[i]);
  30.         converge = sqrtf(sum) <= eps;
  31.         free(x);
  32.         x = x_new;
  33.     }
  34.  
  35.     return x;
  36. }
  37.  
  38. int main(int argc, char** argv)
  39. {
  40.     int size = 0;
  41.     do {
  42.         printf("Введите порядок матрицы:\n");
  43.         scanf("%d", &size);
  44.     } while (size < 1);
  45.  
  46.     float** a = (float**)malloc(sizeof(void*) * size);
  47.  
  48.     printf("Введите матрицу:\n");
  49.     for (int i = 0; i < size; i++)
  50.     {
  51.         a[i] = (float*)malloc(sizeof(float) * (size + 1));
  52.         for (int j = 0; j <= size; j++)
  53.             scanf("%f", &a[i][j]);
  54.     }
  55.     printf("\n");
  56.  
  57.     float* x = seidel(size, a, 0.001f);
  58.     for (int i = 0; i < size; i++)
  59.     {
  60.         printf("x[%d]=%f\n", i + 1, x[i]);
  61.     }
  62.  
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement