Advertisement
FamiHug

Seidel

Jun 10th, 2011
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.91 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:  1.0
  9.  *        Created:  06/09/2011 10:02:20 PM
  10.  *       Revision:  none
  11.  *       Compiler:  gcc
  12.  *
  13.  *         Author:  FamiHug (fh), famihug@gmail.com
  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)
  33. {
  34.     int size = 3;
  35.     int i,j;
  36.  
  37.     printf("Nhap vao ma tran: \n");
  38.     for(i = 0; i < 3; i++)
  39.     {
  40.         for(j = 0; j < 4; j++)
  41.         {
  42.             scanf("%f",matrix + i * (size + 1)  + j);
  43.         }
  44.     }
  45.     printf("Nhap xong!\n");
  46.     return;
  47. }
  48.  
  49. void InMaTran(float *matrix)
  50. {
  51.     int size = 3;
  52.     int i,j;
  53.  
  54.     printf("Ma Tran: \n");
  55.     for(i = 0; i < size; i++)
  56.     {
  57.         for(j = 0; j < size + 1; j++)
  58.         {
  59.             printf("%3.3f ",*(matrix + i * (size + 1) + j));
  60.         }
  61.         printf("\n");
  62.     }
  63.     return;
  64. }
  65.  
  66. //Viet lai theo dang alphaX
  67. float *TraVeAlpha(float *matrix)
  68. {
  69.     int i,j;
  70.     float *alpha;
  71.     int size = 3;
  72.     alpha = NULL;
  73.  
  74.     alpha = matrix;
  75.     for(i = 0; i < size; i++)
  76.     {
  77.         for(j = 0; j < size; j++)
  78.         {
  79.             if(i != j) *(alpha + i * (size + 1) + j) = -(*(alpha + i * (size + 1) + j))/(*(alpha + i * (size + 1) + i));
  80.         }
  81.     }
  82.     for(i = 0; i < 3; i++)
  83.     {
  84.         (*(alpha + i * (size + 1) + size)) /= (*(alpha + i * (size + 1) + i));
  85.         *(alpha + i * (size + 1) + i) = 0;
  86.     }
  87.     return alpha;
  88. }
  89.    
  90. //tach alpha thanh alpha1 + alpha 2
  91. void TachAlpha(float *alpha, float *al1, float *al2)
  92. {
  93.     int i,j;
  94.     int size = 3;
  95.    
  96.     //Copy alpha -> al1, al2
  97.     memcpy(al1, alpha, sizeof(float) * size * (size + 1));
  98.     memcpy(al2, alpha, sizeof(float) * size * (size + 1));
  99.  
  100.     //xoa nua tren duong cheo cua alpha de dc al1
  101.     for(i = 0; i < size; i++)
  102.     {
  103.         for(j = 0; j < size; j++)
  104.         {
  105.             if(j >= i) *(al1 + i * (size + 1) + j) = 0;
  106.             else *(al2 + i * (size + 1) + j) = 0;
  107.         }
  108.     }
  109.    
  110.        
  111.     //Xoa nua duoi duong cheo cua matran alpha de dc al2
  112.  
  113.  
  114.     return;
  115. }
  116.  
  117.  
  118. //Kiem tra tinh lap don
  119.  
  120. float absolute(float x)
  121. {
  122.     if(x >= 0) return x;
  123.     else return -x;
  124. }
  125.  
  126. int isLapDon(float **alpha)
  127. {
  128.     int i,j;
  129.     int size = 3;
  130.     float max = 0;
  131.     float tempSum = 0;
  132.     for(i = 0; i < 3; i++)
  133.     {
  134.         tempSum = 0;
  135.         for(j = 0; j < 3; j++)
  136.         {
  137.             tempSum += absolute(*(*alpha + i * (size + 1) + j));
  138.         }
  139.         if(max < tempSum) max = tempSum;
  140.     }
  141.     printf("Max: %f\n",max);
  142.     if(max < 1) return 1;
  143.     else return 0;
  144. }
  145.  
  146.    
  147. //Chon xap xi dau, so lan lap k
  148. //Thuc hien lap va dua ra ket qua
  149.  
  150. int main(int argc, char **argv)
  151. {
  152.     int size = 3;
  153.     float *matrix;
  154.     float *alpha, *al1, *al2;
  155.  
  156.     matrix = (float *)malloc(sizeof(float) * size * (size + 1));
  157.     al1 = (float *)malloc(sizeof(float) * size * (size + 1));
  158.     al2 = (float *)malloc(sizeof(float) * size * (size + 1));
  159.  
  160.     NhapMaTran(matrix);
  161.     InMaTran(matrix);
  162.     alpha = TraVeAlpha(matrix);
  163.     InMaTran(alpha);
  164.     printf("Co tinh lap don: %d\n",isLapDon(&alpha));
  165.  
  166.     TachAlpha(alpha,al1,al2);
  167.  
  168.     InMaTran(al1);
  169.     InMaTran(al2);
  170.  
  171.     //Nhap vao xap xi dau
  172.     int k = 4; //k la so lan lap
  173.     int i,g;
  174.  
  175.     float R[3][10];
  176.     R[0][0] = 0, R[1][0] = 0, R[2][0] = 0;
  177.  
  178.     for(g = 1; g < k + 1; g++)
  179.     {
  180.         for(i = 0; i < 3; i++)
  181.         {
  182.             R[i][g] = R[0][g - 1] * (*(al1 + i * (size + 1) + 0)) + R[1][g - 1] * (*(al1 + i * (size + 1) + 1)) + R[2][g - 1]  * (*(al1 + i * (size + 1) + 2)) + (*(al2 + i * (size + 1) + 0)) + R[1][g - 1] * (*(al2 + i * (size + 1) + 1)) + R[2][g - 1]  * (*(al2 + i * (size + 1) + 2)) + *(alpha + i * (size + 1) + size);
  183.         }
  184.     }
  185.  
  186.     printf("Ket Qua: \n");
  187.  
  188.     for(i = 0; i < 3; i++)
  189.     {
  190.         for(g = 0; g < k + 1; g++)
  191.         {
  192.             printf("%f ",R[i][g]);
  193.         }
  194.         printf("\n");
  195.     }
  196.  
  197.     return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement