Advertisement
Guest User

TUPO LEGKO

a guest
Dec 3rd, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.62 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <malloc.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <time.h>
  7.  
  8. #define EPS 0.000000001
  9.  
  10. struct matrix
  11. {
  12. size_t w;
  13. size_t h;
  14. double** elems;
  15. };
  16.  
  17. struct vector
  18. {
  19. size_t size;
  20. double* elems;
  21. };
  22.  
  23. struct matrix* create_matrix(size_t w, size_t h)
  24. {
  25. struct matrix* m = malloc(sizeof(*m));
  26. m->elems = malloc(sizeof(double*) * h);
  27. for (size_t i = 0; i < h; i++)
  28. m->elems[i] = malloc(sizeof(double) * w);
  29. m->w = w;
  30. m->h = h;
  31. return m;
  32. }
  33.  
  34. void delete_matrix(struct matrix* m)
  35. {
  36. for (size_t i = 0; i < m->h; i++)
  37. free(m->elems[i]);
  38. free(m);
  39. }
  40.  
  41. struct vector* create_vector(size_t size)
  42. {
  43. struct vector* v = malloc(sizeof(*v));
  44. v->elems = malloc(sizeof(double) * size);
  45. v->size = size;
  46. return v;
  47. }
  48.  
  49. void delete_vector(struct vector* v)
  50. {
  51. free(v->elems);
  52. free(v);
  53. }
  54.  
  55. void print_matrix(const struct matrix* m)
  56. {
  57. for (size_t i = 0; i < m->h; i++)
  58. {
  59. for (size_t j = 0; j < m->w; j++)
  60. printf("%.3lf ", m->elems[i][j]);
  61. printf("\n");
  62. }
  63. printf("\n");
  64. }
  65.  
  66. void print_vector(const struct vector* v)
  67. {
  68. for (size_t i = 0; i < v->size; i++)
  69. printf("%.3lf ", v->elems[i]);
  70. printf("\n\n");
  71. }
  72.  
  73. struct vector* mult(const struct matrix* m, const struct vector* v)
  74. {
  75. struct vector* r = create_vector(v->size);
  76. for (size_t i = 0; i < m->h; i++)
  77. {
  78. r->elems[i] = 0.0;
  79. for (size_t j = 0; j < m->w; j++)
  80. r->elems[i] += m->elems[i][j] * v->elems[j];
  81. }
  82. return r;
  83. }
  84.  
  85. void divide(struct vector* v, double val)
  86. {
  87. for (size_t i = 0; i < v->size; i++)
  88. v->elems[i] /= val;
  89. }
  90.  
  91. struct matrix* sub(const struct matrix* m, double val)
  92. {
  93. struct matrix* r = create_matrix(m->w, m->h);
  94. for (size_t i = 0; i < m->h; i++)
  95. for (size_t j = 0; j < m->w; j++)
  96. r->elems[i][j] = m->elems[i][j] - val;
  97. return r;
  98. }
  99.  
  100. double norm(const struct vector* v)
  101. {
  102. double sum = 0.0;
  103. for (size_t i = 0; i < v->size; i++)
  104. sum += v->elems[i] * v->elems[i];
  105. return sqrt(sum);
  106. }
  107.  
  108. struct vector* ones(int size)
  109. {
  110. struct vector* v = create_vector(size);
  111. for (int i = 0; i < size; i++)
  112. v->elems[i] = 1.0;
  113. return v;
  114. }
  115.  
  116. struct matrix* hilb(int size)
  117. {
  118. struct matrix* m = create_matrix(size, size);
  119. for (int i = 0; i < size; i++)
  120. for (int j = 0; j < size; j++)
  121. m->elems[i][j] = 1.0 / (i + j + 1);
  122. return m;
  123. }
  124.  
  125. struct vector* hilbv(int size)
  126. {
  127. struct vector* v = create_vector(size);
  128. for (int i = 0; i < size; i++)
  129. {
  130. v->elems[i] = 0;
  131. for (int j = 0; j < size; j++)
  132. v->elems[i] += 1.0 / (i + j + 1);
  133. }
  134. return v;
  135. }
  136.  
  137. struct vector* solve_linear_equation(const struct matrix* m, const struct vector* v)
  138. {
  139. if (m->h != v->size || m->w != v->size)
  140. return NULL;
  141. struct matrix* aug = create_matrix(m->w + 1, m->h);
  142. size_t h = aug->h;
  143. size_t w = aug->w;
  144. double** elems = aug->elems;
  145. for (size_t i = 0; i < h; i++)
  146. {
  147. memcpy(aug->elems[i], m->elems[i], sizeof(double) * m->w);
  148. elems[i][w - 1] = v->elems[i];
  149. }
  150. for (size_t i = 0; i < h - 1; i++)
  151. {
  152. size_t max = i;
  153. for (size_t j = i; j < h; j++)
  154. if (fabs(elems[j][i]) > fabs(elems[max][i]))
  155. max = j;
  156. double* t = elems[i];
  157. elems[i] = elems[max];
  158. elems[max] = t;
  159. for (size_t j = i + 1; j < h; j++)
  160. {
  161. double mult = -elems[j][i] / elems[i][i];
  162. for (size_t k = 0; k < w; k++)
  163. aug->elems[j][k] += elems[i][k] * mult;
  164. }
  165. }
  166. struct vector* res = create_vector(h);
  167. res->elems[h - 1] = elems[h - 1][w - 1] / elems[h - 1][w - 2];
  168. for (size_t i = h - 2; i != -1; i--)
  169. {
  170. double sum = 0.0;
  171. for (size_t j = i + 1; j < w - 1; j++)
  172. sum += aug->elems[i][j] * res->elems[j];
  173. res->elems[i] = (elems[i][w - 1] - sum) / aug->elems[i][i];
  174. }
  175. delete_matrix(aug);
  176. return res;
  177. }
  178.  
  179. double min_eigen_value(const struct matrix* m)
  180. {
  181. struct vector* cur_guess = ones(m->w);
  182. for (size_t i = 0; i < 50; i++)
  183. {
  184. struct vector* prev = cur_guess;
  185. cur_guess = solve_linear_equation(m, cur_guess);
  186. delete_vector(prev);
  187. divide(cur_guess, norm(cur_guess));
  188. }
  189. struct vector* prev = cur_guess;
  190. cur_guess = mult(m, cur_guess);
  191. delete_vector(prev);
  192. return norm(cur_guess);
  193. }
  194.  
  195. int main()
  196. {
  197. struct matrix* m = create_matrix(2, 2);
  198.  
  199.  
  200. m->elems[0][0] = 1;
  201. m->elems[0][1] = 2;
  202. m->elems[1][0] = 3;
  203. m->elems[1][1] = 4;
  204.  
  205. print_matrix(m);
  206. double min = min_eigen_value(m);
  207. printf("min: %.5lf", min);
  208. getchar();
  209. return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement