FamiHug

Seidel_0.8

Jun 12th, 2011
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.73 KB | None | 0 0
  1. /*
  2.  * =====================================================================================
  3.  *
  4.  *       Filename:  exp_seidel.c
  5.  *
  6.  *    Description:  Solve example in page 74 - GT GTS LETRONGVINH
  7.  *
  8.  *        Version:  0.8
  9.  *        Created:  06/09/2011 10:02:20 PM
  10.  *       Revision:  none
  11.  *       Compiler:  gcc
  12.  *
  13.  *         Author:  FamiHug (fh), [email protected]
  14.  *        Company:  familug.blogspot.com
  15.  *
  16.  * =====================================================================================
  17.  */
  18.  
  19. //Todo List
  20. //nhap ma tran
  21. //viet ve dang alphaX + beta
  22. //tach alpha thanh alpha 1 + alpha2
  23. //thuc hien lap seidel
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28.  
  29.  
  30. //Nhap ma tran
  31.  
  32. void NhapMaTran(float *matrix, int size)
  33. {
  34.     int i,j;
  35.  
  36.     printf("Nhap vao ma tran: \n");
  37.     for(i = 0; i < size; i++)
  38.     {
  39.         for(j = 0; j < size + 1; j++)
  40.         {
  41.             scanf("%f",matrix + i * (size + 1)  + j);
  42.         }
  43.     }
  44.     printf("Nhap xong!\n");
  45.     return;
  46. }
  47.  
  48. void InDeBai(float *matrix, int size)
  49. {
  50.     int i,j;
  51.  
  52.     printf("Ma Tran: \n");
  53.     for(i = 0; i < size; i++)
  54.     {
  55.         for(j = 0; j < size + 1; j++)
  56.         {
  57.             printf("%3.3f ",*(matrix + i * (size + 1) + j));
  58.         }
  59.         printf("\n");
  60.     }
  61.     return;
  62. }
  63.  
  64.  
  65. void InMaTranVuong(float *matrix, int size)
  66. {
  67.     int i,j;
  68.  
  69.     for(i = 0; i < size; i++)
  70.     {
  71.         for(j = 0; j < size; j++)
  72.         {
  73.             printf("%3.3f ",*(matrix + i * size + j));
  74.         }
  75.         printf("\n");
  76.     }
  77.     return;
  78. }
  79.  
  80. void InBeta(float *beta, int size)
  81. {
  82.     int t;
  83.     printf("Beta\n");
  84.     for(t = 0; t < size; t++)
  85.         printf("%f\n",*(beta + t));
  86.  
  87.     return;
  88. }
  89. //Viet lai theo dang alphaX
  90. //Ver 0.8: tach thah 2 matran alpha va beta reing biet. VIet lai theo kieu void
  91. void TaoAlphaBeta(float *matrix, float *alpha, float *beta)
  92. {
  93.     int i,j;
  94.     int size = 3;
  95.    
  96.     for(i = 0; i < size; i++)
  97.     {
  98.         for(j = 0; j < size; j++)
  99.         {
  100.             if(i != j) *(alpha + i * size + j) = -(*(matrix + i * (size + 1) + j))/(*(matrix + i * (size + 1) + i));
  101.         }
  102.     }
  103.  
  104.     for(i = 0; i < size; i++)
  105.     {
  106.         //Cac phan tu cua Beta
  107.         (*(beta + i)) = (*(matrix + i * (size + 1) + size)) / (*(matrix + i * (size + 1) + i));
  108.         //Alpha[i][i] = 0
  109.         (*(alpha + i * size + i)) = 0;
  110.     }
  111.     return;
  112. }
  113.    
  114. //tach alpha thanh alpha1 + alpha 2
  115. void TachAlpha(float *alpha, float *al1, float *al2)
  116. {
  117.     int i,j;
  118.     int size = 3;
  119.    
  120.     //Copy alpha -> al1, al2
  121.     memcpy(al1, alpha, sizeof(float) * size * size);
  122.     memcpy(al2, alpha, sizeof(float) * size * size);
  123.  
  124.     for(i = 0; i < size; i++)
  125.     {
  126.         for(j = 0; j < size; j++)
  127.         {
  128.     //xoa nua tren duong cheo cua alpha de dc al1
  129.             if(j >= i) *(al1 + i * size + j) = 0;
  130.     //Xoa nua duoi duong cheo cua matran alpha de dc al2
  131.             else *(al2 + i * size + j) = 0;
  132.         }
  133.     }
  134.  
  135.     return;
  136. }
  137.  
  138.  
  139. //Kiem tra tinh lap don
  140.  
  141. float absolute(float x)
  142. {
  143.     if(x >= 0) return x;
  144.     else return -x;
  145. }
  146.  
  147. int isLapDon(float **alpha)
  148. {
  149.     int i,j;
  150.     int size = 3;
  151.     float max = 0;
  152.     float tempSum = 0;
  153.     for(i = 0; i < size; i++)
  154.     {
  155.         tempSum = 0;
  156.         for(j = 0; j < size; j++)
  157.         {
  158.             tempSum += absolute(*(*alpha + i * (size + 1) + j));
  159.         }
  160.         if(max < tempSum) max = tempSum;
  161.     }
  162.     printf("Max: %f\n",max);
  163.     if(max < 1) return 1;
  164.     else return 0;
  165. }
  166.  
  167.    
  168. //Chon xap xi dau, so lan lap k
  169. //Thuc hien lap va dua ra ket qua
  170.  
  171. int main(int argc, char **argv)
  172. {
  173.     int size = 3;
  174.     float *matrix;
  175.     float *alpha, *al1, *al2, *beta;
  176.  
  177.     //malloc for matrix "size x (size + 1)", the matrix from the system of equations
  178.     matrix = (float *)malloc(sizeof(float) * size * (size + 1));
  179.     //malloc for matrix "size x size"
  180.     alpha  = (float *)malloc(sizeof(float) * size * size);
  181.     al1  = (float *)malloc(sizeof(float) * size * size);
  182.     al2  = (float *)malloc(sizeof(float) * size * size);
  183.     //malloc for matrix "size x 1"
  184.     beta = (float *)malloc(sizeof(float) * size * 1);
  185.  
  186.     NhapMaTran(matrix,size);
  187.     InDeBai(matrix,size);
  188.     TaoAlphaBeta(matrix,alpha,beta);
  189.     printf("Alpha: \n");
  190.     InMaTranVuong(alpha,size);
  191.     printf("Co tinh lap don: %d\n",isLapDon(&alpha));
  192.  
  193.     TachAlpha(alpha,al1,al2);
  194.  
  195.     printf("Alpha1: \n");
  196.     InMaTranVuong(al1,size);
  197.     printf("Alpha2: \n");
  198.     InMaTranVuong(al2,size);
  199.  
  200.     InBeta(beta,size);
  201.  
  202.     //Nhap vao xap xi dau
  203.     int k = 4; //k la so lan lap
  204.     int i,g;
  205.  
  206.     //Ham nay can viet lai cho cac truong hop size khac 3
  207.     float R[3][10];
  208.     R[0][0] = 0, R[1][0] = 0, R[2][0] = 0;
  209.  
  210.     for(g = 1; g < k + 1; g++)
  211.     {
  212.         for(i = 0; i < size; i++)
  213.         {
  214.             R[i][g] = R[0][g - 1] * (*(al1 + i * size + 0)) + R[1][g - 1] * (*(al1 + i * size + 1)) + R[2][g - 1]  * (*(al1 + i * size + 2)) + (*(al2 + i * size + 0)) + R[1][g - 1] * (*(al2 + i * size + 1)) + R[2][g - 1]  * (*(al2 + i * size + 2)) + *(beta + i + 0);
  215.         }
  216.     }
  217.  
  218.     printf("Ket Qua: \n");
  219.  
  220.     for(i = 0; i < size; i++)
  221.     {
  222.         for(g = 0; g < k + 1; g++)
  223.         {
  224.             printf("%f ",R[i][g]);
  225.         }
  226.         printf("\n");
  227.     }
  228.  
  229.     return 0;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment