Advertisement
CyberTwilight

Untitled

Dec 7th, 2016
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6.  
  7.  
  8.  
  9. // Cria Matriz MxN
  10. double** mat_cria(int m, int n)
  11. {
  12. double** A;
  13. int i;
  14. A = (double**)malloc(m*sizeof(double*));
  15. for(i=0; i < m; i++)
  16. {
  17. A[i] = (double*)malloc(n*sizeof(double));
  18. }
  19. return A;
  20. }
  21.  
  22.  
  23.  
  24.  
  25. // Libera o espaço alocado pela matriz
  26. void mat_libera(int m, double** A)
  27. {
  28. int i;
  29. for(i=0; i < m; i++)
  30. {
  31. free(A[i]);
  32. }
  33. free(A);
  34. }
  35. // Transposta da matriz
  36. void mat_transposta(int m, int n, double** A, double** T)
  37. {
  38. int i, j;
  39. for(i=0; i < m; i++)
  40. {
  41. for(j=0;j < n; j++)
  42. {
  43. T[j][i] = A[i][j];
  44. }
  45. }
  46. }
  47. // Multiplicação de Vetor x Matriz
  48. void mat_multv(int m, int n, double** A, double* v, double* w)
  49. {
  50. /* matriz MxN . vetor Nx1 -> vetor Mx1*/
  51. int i, j;
  52. for(i = 0; i < m; i++)
  53. w[i] = 0;
  54. for(i = 0; i < m; i++)
  55. {
  56. for(j = 0; j < n; j++)
  57. {
  58. w[i] += A[i][j] * v[j];
  59. }
  60. }
  61. }
  62. // Multiplicação de Matrizes
  63. void mat_multm(int m, int n, int q, double** A, double** B, double** C)
  64. {
  65. int i, j, k, soma = 0;
  66. for(i = 0; i < m; i ++)
  67. {
  68. for(j = 0; j < q; j++)
  69. {
  70. C[i][j] = 0;
  71. }
  72. }
  73. for(i = 0; i < m; i++)
  74. {
  75. for(j = 0; j < q; j++)
  76. {
  77. for(k = 0; k < n; k++)
  78. {
  79. soma+= A[i][k] * B[k][j];
  80. }
  81. C[i][j] = soma;
  82. soma = 0;
  83. }
  84. }
  85. }
  86.  
  87. void printMatriz(int m, int n, double**A)
  88. {
  89. int i,j;
  90. for(i = 0; i < m; i++){
  91. for(j = 0; j < n; j++){
  92. printf("%.2f\t",A[i][j]);
  93. }
  94. printf("\n");
  95. }
  96. }
  97.  
  98. void printVetor(int n, double * A)
  99. {
  100. int i;
  101. for(i = 0; i < n; i++)
  102. {
  103. printf(" %g ", A[i]);
  104. }
  105. printf("\n");
  106. }
  107.  
  108. void swap(double* v1, double*v2)
  109. {
  110. double temp = *v1;
  111. *v1 = *v2;
  112. *v2 = temp;
  113. }
  114.  
  115. void Cholesky (int n, double** A)
  116. {
  117. int t = 0, t2 = 0, j = 0, k = 0, i = 0;
  118. double** R = mat_cria(n, n);
  119.  
  120. for (k = 0; k < n; k++)
  121. {
  122. double** u = mat_cria(n - (k+1), 1);
  123. double** uT = mat_cria(1, n - (k+1));
  124. double** uuT = mat_cria(n - (k+1), n - (k+1));
  125.  
  126. R[k][k] = sqrt(A[k][k]);
  127.  
  128. for (i = 0; i < k; i++)
  129. {
  130. A[k][i] = 0;
  131. }
  132.  
  133. for (i = k+1; i < n; i++)
  134. {
  135. uT[0][t] = (1/R[k][k])*A[k][i];
  136. t++;
  137. }
  138.  
  139. mat_transposta(1, n - (k+1), uT, u);
  140. mat_multm(n - (k+1), 1, n - (k+1), u, uT, uuT);
  141. t = 0;
  142.  
  143. for (i = k+1; i < n; i++)
  144. {
  145. for (j = k+1; j < n; j++)
  146. {
  147. printf("A no nível %d - %d: %f\n", i, j, A[i][j]);
  148. A[i][j] = A[i][j] - uuT[t2][t];
  149. t++;
  150. }
  151. t = 0;
  152. t2++;
  153. }
  154. t2 = 0;
  155. }
  156. }
  157.  
  158. void ConjugateGradient (int n, double** A, double* b, double* x)
  159. {
  160. int i = 0, j = 0, k = 0;
  161. double num = 0, den = 0, alpha = 0, beta = 0;
  162. double *Ax = (double*)malloc(n*sizeof(double));
  163. double *Ad = (double*)malloc(n*sizeof(double));
  164. double *dk = (double*)malloc(n*sizeof(double));
  165. double *rk = (double*)malloc(n*sizeof(double));
  166.  
  167. mat_multv(n,n, A, x, Ax);
  168.  
  169. for(i = 0; i < n; i++)
  170. {
  171. dk[i] = b[i] - Ax[i];
  172. rk[i] = dk[i];
  173. }
  174.  
  175. while(k != n)
  176. {
  177. mat_multv(n, n, A, dk, Ad);
  178.  
  179. for(i = 0; i < n; i++)
  180. {
  181. num += rk[i]*rk[i];
  182. den +=dk[i]*Ad[i];
  183. }
  184.  
  185. alpha = num/den;
  186.  
  187. den = num;
  188. num = 0;
  189.  
  190. for(i = 0; i < n; i++)
  191. {
  192. x[i] = x[i] + alpha*dk[i];
  193. rk[j] = rk[j] - alpha*Ad[i];
  194. num += rk[j]*rk[j];
  195. }
  196.  
  197. beta = num/den;
  198.  
  199. for(i = 0; i < n; i++){
  200. dk[i] = rk[i] + beta*dk[i];
  201. if (rk[i] == 0) j++;
  202. }
  203.  
  204. if (j == n) break;
  205. k++;
  206. }
  207. }
  208.  
  209. int main (void)
  210. {
  211. int i, j = 0;
  212. double** A1 = mat_cria(3, 3);
  213. double** A2 = mat_cria(3, 3);
  214. double* x1 = (double*)malloc(3*sizeof(double));
  215. double* x2 = (double*)malloc(3*sizeof(double));
  216. double* b1 = (double*)malloc(3*sizeof(double));
  217. double* b2 = (double*)malloc(3*sizeof(double));
  218.  
  219. A1[0][0] = 1; A1[0][1] = -1; A1[0][2] = 0;
  220. A1[1][0] = -1; A1[1][1] = 2; A1[1][2] = 1;
  221. A1[2][0] = 0; A1[2][1] = 1; A1[2][2] = 2;
  222.  
  223. for(i = 0; i < 3; i++){
  224. for(j = 0; j < 3; j++){
  225. A2[i][j] = A1[i][j];
  226. }
  227. }
  228.  
  229. A2[2][2] = 5;
  230.  
  231. b1[0] = 0; b1[1] = 2; b1[2] = 3;
  232.  
  233. b2[0] = 3; b2[1] = -3; b2[2] = 4;
  234.  
  235. ConjugateGradient (3, A1, b1, x1);
  236. ConjugateGradient (3, A2, b2, x2);
  237. Cholesky(3, A1);
  238. Cholesky(3, A2);
  239.  
  240. printMatriz(3, 3, A1);
  241. printMatriz(3, 3, A2);
  242. printVetor(3, x1);
  243. printVetor(3, x2);
  244. return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement