Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.49 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #include <stdlib.h>
  4.  
  5. #include <windows.h>
  6.  
  7. #include <math.h>
  8.  
  9. #include <time.h>
  10.  
  11. #define _CRT_SECURE_NO_WARNINGS_
  12.  
  13. #define B(i,j) MM[i*(n+2)+j]
  14.  
  15. #define A(i,j) M[i*(n+2)+j]
  16.  
  17. float *M, *MM, eps, epst, t;
  18.  
  19. int n, iter, it;
  20.  
  21. int iter_Up();
  22.  
  23. void var_M();
  24.  
  25. void Ax_b();
  26.  
  27. int main()
  28.  
  29. {
  30.  
  31. int i, j, code, fl = 0, c;
  32.  
  33. int fl1 = 0, iopt;
  34.  
  35. float topt, dt = 0.05;
  36.  
  37. char s[2];
  38.  
  39. SetConsoleCP(1251); //чтобы воспринимала русские буквы
  40.  
  41. SetConsoleOutputCP(1251);
  42.  
  43. printf(" *** Программа находит решение системы методом верхней релаксации *** ");
  44.  
  45. printf("\nВведите размерность системы: ");
  46.  
  47. scanf("%d", &n);
  48.  
  49. double *M = (double*)malloc(n*(n+2));
  50.  
  51. double *MM = (double*)malloc(n*(n + 2));
  52.  
  53. printf("Введите 0/1 - задать систему случайным образом или вручную ");
  54.  
  55. scanf("%d", &c);
  56.  
  57. switch (c) {
  58.  
  59. case 0:
  60.  
  61. //инициализация датчика п.с. чисел текущим временем
  62.  
  63. srand(time(NULL));
  64.  
  65. for (i = 0; i < n; i++)for (j = 0; j < n + 1; j++)B(i, j) = 0.5 - rand() / (RAND_MAX + 1.0);
  66.  
  67. break;
  68.  
  69. default:
  70.  
  71. for (i = 0; i < n; i++) {
  72.  
  73. for (j = 0; j < n; j++) {
  74.  
  75. printf("Введите B(%d,%d): ", i, j);
  76.  
  77. scanf("%f", &B(i, j));
  78.  
  79. }
  80.  
  81. printf("Введите b(%d): ", i);
  82.  
  83. scanf("%f", &B(i, n));
  84.  
  85. }
  86.  
  87. }
  88.  
  89. printf("Введенная система:\n");
  90.  
  91. for (i = 0; i < n; i++) {
  92.  
  93. for (j = 0; j < n; j++) {
  94.  
  95. printf("%f ", B(i, j));
  96.  
  97. }
  98.  
  99. printf("%f\n", B(i, n));
  100.  
  101. }
  102.  
  103. var_M(); //умножаем систему на At
  104.  
  105. printf("Преобразованная система:\n");
  106.  
  107. for (i = 0; i < n; i++) {
  108.  
  109. for (j = 0; j < n; j++) {
  110.  
  111. printf("%f ", A(i, j));
  112.  
  113. }
  114.  
  115. printf("%f\n", A(i, n));
  116.  
  117. }
  118.  
  119. while (fl == 0) {
  120.  
  121. printf("Введите число итераций,точность и параметр t: ");
  122.  
  123. scanf("%d %f %f", &iter, &eps, &t);
  124.  
  125. //printf("Введенные точность, число итераций и t = %f %d %.2f",eps,iter,t);
  126.  
  127. var_M();
  128.  
  129. code = iter_Up();
  130.  
  131. switch (code)
  132.  
  133. {
  134.  
  135. case 0: //все хорошо
  136.  
  137. printf("\nКод = %d, Число использованных итераций = %d, Точность = %.8f", code, it, epst);
  138.  
  139. printf("\nРешение:\n");
  140.  
  141. for (i = 0; i < n; i++) {
  142.  
  143. printf("%f ", A(i, n + 1));
  144.  
  145. }
  146.  
  147. Ax_b();
  148.  
  149. printf("\nНевязка:\n");
  150.  
  151. for (i = 0; i < n; i++) {
  152.  
  153. printf("%f ", B(i, n + 1));
  154.  
  155. }
  156.  
  157. printf("\nНайти отимальное t -> Введите 0, иначе 1 - ввод новых параметров, 2 - выход: "); scanf("%d", &fl1);
  158.  
  159. if (fl1 == 1) break;
  160.  
  161. if (fl1 == 2) { fl = 1; break; }
  162.  
  163. if (fl1 == 0) { //нужно найти оптимальное t
  164.  
  165. iopt = iter; t = 0;
  166.  
  167. for (i = 0; i < 40; i++) {
  168.  
  169. t = t + dt; // dt = 0.05
  170.  
  171. var_M();
  172.  
  173. code = iter_Up();
  174.  
  175. if ((code == 0) && (it < iopt)) { iopt = it; topt = t; }
  176.  
  177. }
  178.  
  179. printf("\nПолучены следующие оптимальные значения t и iter: %.3f; %d", topt, iopt);
  180.  
  181. printf("\nПовторить вычисления для новых параметров итерационного процесса - введите 0, иначе 1: ");
  182.  
  183. scanf("%d", &fl);
  184.  
  185. }
  186.  
  187. break;
  188.  
  189. case 1:
  190.  
  191. printf("\nВ матрице системы есть диагональный компонент = 0 !");
  192.  
  193. fl = 1;
  194.  
  195. break;
  196.  
  197. case 2:
  198.  
  199. printf("\nМетод разошелся !");
  200.  
  201. // fl=1;
  202.  
  203. break;
  204.  
  205. }
  206.  
  207. }
  208.  
  209. printf("\nДля завершения программы нажмите любую клавишу и ENTER ");
  210.  
  211. scanf("%s", s); printf("\n");
  212.  
  213. return 0;
  214.  
  215. }
  216.  
  217. //п/п реализует итерационный метод верхней релаксации
  218.  
  219. int iter_Up() {
  220.  
  221. int i, j, k, fl = 0;
  222.  
  223. float nt, buf, norm, norm_old = 0, t1 = 1 - t;
  224.  
  225. //нормировка системы
  226.  
  227. for (i = 0; i < n; i++) {
  228.  
  229. A(i, n + 1) = A(i, n);
  230.  
  231. if (fabs(A(i, i) < 1.E-30))return 1; //есть A(i,i)=0
  232.  
  233. A(i, n) = t * A(i, n) / A(i, i);
  234.  
  235. for (j = 0; j < n; j++)if (i != j)A(i, j) = t * A(i, j) / A(i, i);
  236.  
  237. }
  238.  
  239. it = 0; //число выполненных итераций
  240.  
  241. for (k = 1; k <= iter; k++) { //цикл по итерациям
  242.  
  243. it = it + 1; norm = 0;
  244.  
  245. for (i = 0; i < n; i++) { //цикл по уравнениям
  246.  
  247. buf = t1 * A(i, n + 1) + A(i, n);
  248.  
  249. for (j = 0; j < n; j++) if (i != j)buf = buf - A(i, j)*A(j, n + 1);
  250.  
  251. nt = fabs(buf - A(i, n + 1)); A(i, n + 1) = buf;
  252.  
  253. if (nt > norm) norm = nt;
  254.  
  255. }
  256.  
  257. epst = norm;
  258.  
  259. if (norm <= eps)return 0; //все хорошо
  260.  
  261. if (norm > norm_old)fl = fl + 1; else fl = 0;
  262.  
  263. if (fl > 3)return 2; //процесс расходится
  264.  
  265. norm_old = norm;
  266.  
  267. }
  268.  
  269. return 0;
  270.  
  271. }
  272.  
  273. //п/п симметрезует систему
  274.  
  275. void var_M() {
  276.  
  277. int i, j, k;
  278.  
  279. for (i = 0; i < n; i++) {
  280.  
  281. for (j = 0; j <= n; j++) {
  282.  
  283. A(i, j) = 0.;
  284.  
  285. for (k = 0; k < n; k++)
  286. A(i, j) = A(i, j) + B(k, i)*B(k, j);
  287.  
  288. }
  289.  
  290. }
  291.  
  292. }
  293.  
  294. //п/п вычисляет невязку
  295.  
  296. void Ax_b() {
  297.  
  298. int i, j;
  299.  
  300. for (i = 0; i < n; i++) {
  301.  
  302. B(i, n + 1) = B(i, n);
  303.  
  304. for (j = 0; j < n; j++) B(i, n + 1) = B(i, n + 1) - B(i, j)*A(j, n + 1);
  305.  
  306. }
  307.  
  308. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement