Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.57 KB | None | 0 0
  1. \documentclass{report}
  2. \usepackage{amsmath,amsthm,amssymb}
  3. \usepackage{mathtext}
  4. \usepackage[T1,T2A]{fontenc}
  5. \usepackage[utf8]{inputenc}
  6. \usepackage[english,russian]{babel}
  7. \usepackage[left=25mm, top=20mm, right=10mm, bottom=20mm, nohead, nofoot]{geometry}
  8. \usepackage{listings}
  9.  
  10.  
  11. \begin{document}
  12.  
  13. \begin{center}
  14. \normalsize{\bfМОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ \\
  15. им М.В. Ломоносова \\}
  16. \
  17. \\
  18. \normalsize{ Факультет вычислительной математики и кибернетики}\\
  19. \noindent\rule{\textwidth}{1pt} %линия
  20.  
  21. \topskip=0pt
  22. \vspace*{\fill}
  23. \normalsize{\bf
  24. Компьютерный практикум по учебному курсу \\
  25. <<ВВЕДЕНИЕ В ЧИСЛЕННЫЕ МЕТОДЫ>> \\
  26. ЗАДАНИЕ №1 \\
  27. \
  28. \\
  29. ОТЧЕТ \\
  30. о выполненном задании \\
  31. }
  32. \normalsize{
  33. студента \underline{206} учебной факультета ВМК МГУ \\
  34. \underline{Арутюнова Эдгара Арамовича }
  35. \\
  36. }
  37. {\tiny
  38. (фамилия имя отчество студента)
  39. }
  40. \vspace*{\fill}
  41.  
  42.  
  43. гор.Москва \\ 2018 \\
  44.  
  45. \thispagestyle{empty}
  46.  
  47. \end{center}
  48.  
  49. \newpage %титульный
  50.  
  51. \tableofcontents
  52.  
  53. \newpage %начало
  54.  
  55. \parindent=1cm
  56.  
  57. \chapter{Постановка задачи и ее целей}
  58. \section{Цель работы}
  59. \
  60.  
  61. Изучить классический метод Гаусса (а также модифицированный метод Гаусса), применяемый
  62. для решения системы линейных алгебраических уравнений.
  63.  
  64.  
  65. Дана система уравнений $Ax=f$ порядка $n*n$ с невырожденной матрицей $A$.
  66. Написать программу,
  67. решающую систему линейных алгебраический уравнений
  68. заданного пользователем
  69. размером ($n$ - параметр программы) методом Гаусса и
  70. методом Гаусса с выбором главного
  71. элемента).
  72. Предусмотреть возможность задания элементов матрицы системы
  73. и её правой части как
  74. во входном файле данных, так и путём задания специальных формул.
  75.  
  76. \section{Цели и задачи практической работы}
  77. \
  78. \begin{enumerate}
  79. \item Решить заданную СЛАУ методом Гаусса.
  80. и методом Гаусса с выбором главного элемента.
  81. \item Вычислить опеределитель матрицы $det(A)$.
  82. \item Вычислить обратную матрицу $A^{-1}$.
  83. \item Опеределить число обусловленности $M_A=||A|| * ||A_{-1}||$
  84. \item Исследовать вопрос вычислительной устойчивости метода
  85. Гаусса (при больших значениях параметра $n$);
  86. \item Правильность решения СЛАУ подтвердить системой
  87. тестов используя ресурсы on-line системы \\
  88. http://www.wolframalpha.com.
  89. \end{enumerate}
  90.  
  91. \chapter{Описание методов}
  92. \section{Решение СЛАУ методом Гаусса}
  93. \
  94.  
  95. Метод Гаусса — классический метод решения системы линейных алгебраических уравнений
  96. (СЛАУ).Рассмотрим систему линейных уравнений с действительными постоянными коэффициентами:
  97.  
  98. \begin{equation*}
  99. \begin{cases}
  100. a_{11} \cdot x_{1} +
  101. a_{12} \cdot x{2} +
  102. \ldots +
  103. a_{1n} \cdot x_n = y_{1}
  104. \\
  105. a_{11} \cdot x_{1} +
  106. a_{12} \cdot x{2} +
  107. \ldots +
  108. a_{1n} \cdot x_n = y_{1}
  109. \\
  110. \vdots
  111. \\
  112. a_{n1} \cdot x_{1} +
  113. a_{n2} \cdot x{2} +
  114. \ldots +
  115. a_{nn} \cdot x_n = y_{1}
  116. \end{cases}
  117. \end{equation*}
  118.  
  119. Или в матричной форме:
  120.  
  121. \[
  122. \begin{bmatrix}
  123. a_{11} \ldots a_{1,n}
  124. \\ \vdots \ddots \vdots
  125. \\ a_{n1} ... a_{n,n}
  126. \end{bmatrix}
  127. \cdot
  128. \begin{bmatrix}
  129. x_{1}
  130. \\ \vdots
  131. \\ x_{n}
  132. \end{bmatrix}
  133. =
  134. \begin{bmatrix}
  135. y_{1}
  136. \\ \vdots
  137. \\ y_{n}
  138. \end{bmatrix}
  139. \]
  140. Метод Гаусса заключается в применении следующих элементарных преобразований:
  141. \begin{enumerate}
  142. \item Перестановка двух уравнений в системе.
  143. \item Умножение уравнения на число, отличное от нуля.
  144. \item Прибавлением к одному уравнению другого,
  145. домноженного на коэффициент, отличныйот нуля.
  146. \end{enumerate}
  147. \
  148. \\
  149. Метод Гаусса решения системы линейных уравнений включает в себя 2 стадии:
  150. \begin{enumerate}
  151. \item Прямой ход.
  152. \item Обратной ход.
  153. \end{enumerate}
  154.  
  155. \section{Прямой ход}
  156. \
  157. Метод Гаусса условно можно разделить на 2 части: прямой ход и обратный ход.
  158. Прямой ход:
  159. На первом этапе матрица коэффициентов с помощью элементарных преобразований
  160. приводится к верхнетреугольному или ступенчатому виду, и устанавливается ее
  161. совместность. Среди элементов первого столбца выбирается ненулевой элемент и строка
  162. с этим элементом меняется с первой строкой матрицы, далее все элементы первой строки
  163. делятся на первый элемент этой строки. Затем первая строка помноженная на первые
  164. элементы строк вычитается из всех последующих строк, тем самым мы обнуляем столбец
  165. под первым элементом. После того, как указанные преобразования были завершены мы
  166. переходим к нижнему правому минору размера на единицу меньше текущей матрицы и
  167. повторяем с ним вышеизложенный алгоритм, пока не достигнем минора размера 0.
  168. Обратный ход:
  169. На втором этапе из каждого уравнения(i-го), начиная с последнего, выражается i
  170. переменная через i элемент столбца b и последующие переменные, которые были
  171. вычислены на предыдущих шагах.
  172. Заметим, что при решении СЛАУ методом Гаусса, если ведущие элементы окажутся очень
  173. маленькими по абсолютной величине, то при делении на такие ведущие элементы
  174. получается большая погрешность округления (вычислительная погрешность). Чтобы
  175. избежать сильного влияния вычислительной погрешности на решение, применяется метод
  176. Гаусса с выбором главного элемента.
  177. Метод Гаусса с выбором главного элемента отличается от метода Гаусса лишь тем, что
  178. при прямом ходе мы выбираем не произвольные ненулевой элемент в первом столбце, а
  179. наибольший.
  180.  
  181. \section{Число операций(сложение, умножение, деление) }
  182.  
  183. Общее число операций, необходимых для решения задачи по методу
  184. Гаусса, имеет порядок
  185. $O(n^{3})$.
  186.  
  187. \chapter{Программа}
  188.  
  189. \section{Структура}
  190. \
  191. В программе во всех функциях следующие имена переменных обозначают:
  192. $n$ - размер матрицы коэффицентов
  193. $A$ - массив размера $n \cdot (n+1)$, где последний столбец -
  194. столбец свободных
  195. членов, а оставшаяся матрица - матрица коэффициентов СЛАУ
  196. $rev\_matrix$ - обратная матрица
  197.  
  198. Для решения поставленной задачи в программе реализованы следующие функции:
  199.  
  200. void creat\_matrix(double ***A, int n)
  201.  
  202. Принимает на вход указатель и размер матрицы коэффициентов, и по адресу указателя
  203. записывает матрицу коэффициентов вычисленную по заранее заданной формуле
  204.  
  205. \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
  206.  
  207. void read\_matrix(double ***A, int n, const char *filename)
  208.  
  209. Принимает на вход указатель, размер матрицы коэффициентов и имя файла, и
  210. записывает по указателю матрицу коэффициентов переданную в файле
  211.  
  212. \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
  213.  
  214. double *gauss (double **A, double **rev\_matrix, int n)
  215.  
  216. Принимает на вход матрицу коэффициентов и ее размер, а также единичную матрицы
  217. Функция реализует метод Гаусса и возвращает указатель на вектор-решение, а также
  218. преобразует единичную матрицу в обратную и производит вспомогательные подсчеты для
  219. дальнейшего вычисления определителя. В случае неединственности решения или его
  220. несуществования возвращает NULL
  221.  
  222. \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
  223.  
  224. double *gauss\_with\_main (double **A, double **rev\_matrix, int n)
  225.  
  226. Принимает на вход матрицу коэффициентов и ее размер, а также единичную матрицы
  227. Функция реализует метод Гаусса с выбором главного элемента и возвращает указатель на
  228. вектор-решение, а также преобразует единичную матрицу в обратную и производит
  229. вспомогательные подсчеты для дальнейшего вычисления определителя. В случае
  230. неединственности решения или его несуществования возвращает NULL
  231.  
  232. \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
  233.  
  234. void init\_rev\_matrix(double ***rev\_matrix, int n)
  235.  
  236. Принимает на вход указатель и размер матрицы, и записывает по указателю единичную
  237. матрицу размера n
  238.  
  239. \chapter{Тесты}
  240. \
  241.  
  242. \section{Ручные тесты}
  243. \
  244. \begin{equation*}
  245. \begin{cases}
  246. 3 \cdot x_{1} -
  247. 2 \cdot x_{2} +
  248. 2 \cdot x_{3} +
  249. 2 \cdot x_{4}
  250. =
  251. 8
  252. \\
  253. 2 \cdot x_{1} -
  254. 1 \cdot x_{2} +
  255. 2 \cdot x_{3}
  256. =
  257. 4
  258.  
  259. \\
  260. 2 \cdot x_{1} +
  261. 1 \cdot x_{2} +
  262. 4 \cdot x_{3} +
  263. 8 \cdot x_{4}
  264. =
  265. -1
  266. \\
  267. 1 \cdot x_{1} +
  268. 3 \cdot x_{2} -
  269. 6 \cdot x_{3} +
  270. 2 \cdot x_{4}
  271. =
  272. 8
  273. \\
  274. \end{cases}
  275. \end{equation*}
  276.  
  277. \begin{equation*}
  278. \begin{cases}
  279. 2 \cdot x_{1} -
  280. 3 \cdot x_{2} +
  281. 1 \cdot x_{3} +
  282. 2 \cdot x_{4}
  283. =
  284. 4
  285. \\
  286. 4 \cdot x_{1} +
  287. 3 \cdot x_{2} +
  288. 1 \cdot x_{3} +
  289. 1 \cdot x_{4}
  290. =
  291. 5
  292.  
  293. \\
  294. 1 \cdot x_{1} -
  295. 7 \cdot x_{2} -
  296. 1 \cdot x_{3} -
  297. 2 \cdot x_{4}
  298. =
  299. 7
  300. \\
  301. 2 \cdot x_{1} +
  302. 5 \cdot x_{2} +
  303. 1 \cdot x_{3} +
  304. 1 \cdot x_{4}
  305. =
  306. 1
  307. \\
  308. \end{cases}
  309. \end{equation*}
  310.  
  311.  
  312. \begin{equation*}
  313. \begin{cases}
  314. 1 \cdot x_{1} -
  315. 1 \cdot x_{2} +
  316. 1 \cdot x_{3} -
  317. 1 \cdot x_{4}
  318. =
  319. 0
  320. \\
  321. 4 \cdot x_{1} -
  322. 1 \cdot x_{2} -
  323. 1 \cdot x_{4}
  324. =
  325. 0
  326.  
  327. \\
  328. 2 \cdot x_{1} +
  329. 1 \cdot x_{2} -
  330. 2 \cdot x_{3} +
  331. 1 \cdot x_{4}
  332. =
  333. 0
  334. \\
  335. 5 \cdot x_{1} +
  336. 1 \cdot x_{2} -
  337. 4 \cdot x_{4}
  338. =
  339. 0
  340. \\
  341. \end{cases}
  342. \end{equation*}
  343.  
  344. \section{Генерируемый тест}
  345. \
  346.  
  347. \begin{equation*}
  348. A_{ij} =
  349. \begin{cases}
  350. q_{M}^{i+j} + 0.1 * (j - i), \ \ i \neq j
  351. \\
  352. (q_{M} - 1)^{i+j}, \ \ \ \ \ \ \ \ \ \ \ i = j
  353. \end{cases}
  354. где\ q_{M}=1.001 - 2 \cdot M \cdot 10^{-3}, i, j = \overline{1, ..., n}
  355. \end{equation*}
  356. \newpage
  357.  
  358. \chapter{Описание программы и её исходный код}
  359. \section{main.c}
  360. \
  361.  
  362.  
  363.  
  364. \begin{lstlisting}
  365.  
  366. #include <stdio.h>
  367. #include <stdlib.h>
  368. #include <math.h>
  369. double m = 1; //начальное значение определителя
  370. // Заполнение матрицы коэффициентов по формуле
  371. void
  372. creat_matrix(double ***A, int n)
  373. {
  374. *A = calloc(n, sizeof(**A));
  375. for(int i = 0; i < n; i++)
  376. (*A)[i] = calloc(n + 1, sizeof(***A));
  377. int M = 6;
  378. double q = 1.001 - 2 * M * 0.001;
  379. for (int i = 1; i <= n; i++) {
  380. for (int j = 1; j <= n; j++) {
  381. if(i == j) {
  382. (*A)[i - 1][j - 1] = pow(q - 1, i + j);
  383. }
  384. else {
  385. (*A)[i - 1][j - 1] = pow(q, i + j) - 0.1 * (j - i);
  386. }
  387. }
  388. (*A)[i - 1][n] = exp(1 / i) * cos(1 / i);
  389. }
  390. }
  391. // Считывание матрицы коэффициентов из файла
  392. void
  393. read_matrix(double ***A, int n, const char *filename)
  394. {
  395. FILE *file = fopen(filename, "r");
  396. *A = calloc(n, sizeof(**A));
  397. for(int i = 0; i < n; i++)
  398. (*A)[i] = calloc(n + 1, sizeof(***A));
  399. for (int i = 0; i < n; i++) {
  400. for (int j = 0; j < n + 1; j++) {
  401. fscanf(file, "%lf", &((*A)[i][j]));
  402. }
  403. }
  404. }
  405. // Метод Гаусса
  406. double
  407. *gauss (double **A, double **rev_matrix, int n)
  408. {
  409. double *x = calloc(n, sizeof(*x));
  410. double tmp;
  411.  
  412. // Прямой ход
  413.  
  414. for (int i = 0; i < n; i++)
  415. {
  416. int p;
  417. for (p = 0; p < n && A[p][i] == 0; p++); // Поиск не нулевого
  418. элемента в столбце
  419. if (p == n) {
  420. printf("Система несовместна или имеет более одного решения
  421. \ndet(A)=0\nОбратная матрица не существует\n");
  422. free(x);
  423. return NULL;
  424. }
  425. else { // Перестановка строки с ненулевым элементом в начало
  426. double *c = A[i];
  427. A[i] = A[p];
  428. A[p] = c;
  429. c = rev_matrix[i];
  430. rev_matrix[i] = rev_matrix[p];
  431. rev_matrix[p] = c;
  432. }
  433. tmp = A[i][i];
  434. m *= tmp; // Домножаем определитель
  435. A[i][n] /= tmp;
  436. for (int j = n - 1; j >= 0; j—) {
  437. // Деление строки на первый элемент
  438. A[i][j] /= tmp;
  439. rev_matrix[i][j] /= tmp;
  440. }
  441. for (int j = i + 1; j < n; j++) {
  442. // Вычитание строки из последующих
  443. tmp = A[j][i];
  444. A[j][n] -= tmp * A[i][n];
  445. for (int k = n - 1; k >= 0; k--) {
  446. A[j][k] -= tmp * A[i][k];
  447. rev_matrix[j][k] -= tmp * rev_matrix[i][k];
  448. }
  449. }
  450. }
  451.  
  452. // Обратный ход
  453.  
  454. x [n - 1] = A[n - 1][n];
  455. for (int i = n - 2; i >= 0; i--)
  456. {
  457. x[i] = A[i][n];
  458. for (int j = i + 1;j < n; j++) {
  459. x[i] -= A[i][j] * x[j];
  460. for (int k = 0; k < n; k++) {
  461. rev_matrix[i][k] -= A[i][j] * rev_matrix[j][k];
  462. }
  463. }
  464. }
  465. return x;
  466. }
  467.  
  468. // Метод Гаусса с выбором главного элемента
  469. double
  470. *gauss_with_main (double **A, double **rev_matrix, int n)
  471. {
  472. double *x = calloc(n, sizeof(*x));
  473. double tmp;
  474. // Прямой ход
  475.  
  476. for (int i = 0; i < n; i++)
  477. {
  478. double max = fabs(A[i][i]);
  479. int max_i = i;
  480. for (int j = i; j < n; j++) {
  481. // Поиск главного элемента
  482. if(max < fabs(A[j][i])) {
  483. max = fabs(A[j][i]);
  484. max_i = j;
  485. }
  486. }
  487. if(A[max_i][i] == 0)
  488. {
  489. printf(
  490. "Система несовместна или имеет более одного решения
  491. \ndet(A)=0\nОбратная матрица не существует\n");
  492. free(x);
  493. return NULL;
  494. }
  495. if(i != max_i) {
  496. // Перестановка строки с главным элементом в начало
  497. double *c;
  498. c = A[i];
  499. A[i] = A[max_i];
  500. A[max_i] = c;
  501. c = rev_matrix[i];
  502. rev_matrix[i] = rev_matrix[max_i];
  503. rev_matrix[max_i] = c;
  504. m *= -1; // Меняем знак определителя
  505. }
  506. tmp = A[i][i];
  507. m *= tmp; // Домножаем определитель
  508. A[i][n] /= tmp;
  509. for (int j = n - 1; j >= 0; j--) {
  510. // Деление строки на первый элемент
  511. A[i][j] /= tmp;
  512. rev_matrix[i][j] /= tmp;
  513. }
  514. for (int j = i + 1; j < n; j++) {
  515. // Вычитание строки из последующих
  516. tmp = A[j][i];
  517. A[j][n] -= tmp * A[i][n];
  518. for (int k = n - 1; k >= 0; k--) {
  519. A[j][k] -= tmp * A[i][k];
  520. rev_matrix[j][k] -= tmp * rev_matrix[i][k];
  521. }
  522. }
  523. }
  524.  
  525. // Обратный ход
  526.  
  527. x [n - 1] = A[n - 1][n];
  528. for (int i = n - 2; i >= 0; i--)
  529. {
  530. x[i] = A[i][n];
  531. for (int j = i + 1;j < n; j++) {
  532. x[i] -= A[i][j] * x[j];
  533. for (int k = 0; k < n; k++) {
  534. rev_matrix[i][k] -= A[i][j] * rev_matrix[j][k];
  535. }
  536. }
  537. }
  538. return x;
  539. }
  540.  
  541. // Создание единичной матрицы
  542. void
  543. init_rev_matrix(double ***rev_matrix, int n)
  544. {
  545. *rev_matrix = calloc(n, sizeof(**rev_matrix));
  546. for (int i = 0; i < n; i++) {
  547. (*rev_matrix)[i] = calloc(n, sizeof(***rev_matrix));
  548. (*rev_matrix)[i][i] = 1;
  549. }
  550. }
  551.  
  552. int
  553. main(int argc, const char * argv[]) {
  554. int n;
  555. double **A;
  556. double **rev_matrix;
  557. double *x;
  558.  
  559. /************************************
  560. Выбор способа задания матрицы коэффициентов:
  561. 1) Через формулу - 1 аргумент программы (размер матрицы)
  562. 2) Матрица коэффициентов записана в файле - 2 аргумента (имя файла,
  563. размер матрицы)
  564. ************************************/
  565.  
  566. if (argc == 1) {
  567. printf("Некорректный запуск программы, укажите аргументы");
  568. return 1;
  569. }
  570. if(argc == 2) {
  571. n = atoi(argv[1]);
  572. creat_matrix(&A, n);
  573. }
  574. else {
  575. n = atoi(argv[2]);
  576. read_matrix(&A, n, argv[1]);
  577. }
  578. init_rev_matrix(&rev_matrix, n);
  579.  
  580. // Выбор метода решения СЛАУ
  581.  
  582. printf("Выберите метод:\n1)Метод Гаусса\n2)Метод Гаусса с выбором
  583. главного элемента\n");
  584. int id;
  585. scanf("%d", &id);
  586. if(id == 1) {
  587. x = gauss(A, rev_matrix, n);
  588. }
  589. else {
  590. x = gauss_with_main(A, rev_matrix, n);
  591. }
  592. if (x == NULL) {
  593. return 0;
  594. }
  595. // Вывод полученной информации
  596.  
  597. printf("x = (");
  598. for (int i = 0; i < n - 1; i++) {
  599. printf("%.g, ", x[i]);
  600. }
  601. printf("%.g)\n", x[n - 1]);
  602. printf("det(A) = %.10f\n", m);
  603. printf("Обратная матрица:\n");
  604. for (int i = 0; i < n; i++) {
  605. for (int j = 0; j < n; j++) {
  606. printf("%.g ", rev_matrix[i][j]);
  607. }
  608. printf("\n");
  609. }
  610. free(x);
  611. for (int i = 0; i < n; i++) {
  612. free(A[i]);
  613. free(rev_matrix[i]);
  614. }
  615. free(A);
  616. free(rev_matrix);
  617. return 0;
  618. }
  619. \end{lstlisting}
  620.  
  621.  
  622. \newpage
  623. \chapter{Вывод программы}
  624. \
  625.  
  626. >> cat m.txt
  627.  
  628. << 3 -2 2 -2 8
  629.  
  630. << 2 -1 2 4
  631.  
  632. << 2 1 4 8 -1
  633.  
  634. << 1 3 -6 2 3
  635.  
  636. >> ./m m.txt 4
  637.  
  638. << Выберите метод:
  639.  
  640. << 1)Метод Гаусса
  641.  
  642. << 2)Метод Гаусса с выбором главного элемента
  643.  
  644. >> 1
  645.  
  646. << x = (3.8571428571, 1.2857142857, -1.0714285714, -0.5714285714)
  647.  
  648. << det(A) = 461.99999999999988631316227838397026062011718750000000
  649.  
  650. << Обратная матрица:
  651.  
  652. << 0.4 0.4 -0.1 -0.3
  653.  
  654. << 0.1 0.2 -0.02 -0.3
  655.  
  656. << -0.1 -0.1 0.1 0.2
  657.  
  658. << -0.1 0.2 -0.02 -0.004
  659.  
  660. \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
  661.  
  662. >> cat m.txt
  663.  
  664. << 2 3 1 2 4
  665.  
  666. << 4 2 1 1 5
  667.  
  668. << 1 -7 -1 -2 7
  669.  
  670. << 2 5 1 1 1
  671.  
  672. >> ./m m.txt 4
  673.  
  674. << Выберите метод:
  675.  
  676. << 1)Метод Гаусса
  677.  
  678. << 2)Метод Гаусса с выбором главного элемента
  679.  
  680. >> 1
  681.  
  682. x = (17.0000000000, 10.0000000000, -106.0000000000, 23.0000000000)
  683.  
  684. << det(A) = -1.00000000000000088817841970012523233890533447265625
  685.  
  686. << Обратная матрица:
  687.  
  688. 3 -4 3 4
  689.  
  690. 2 -3 2 3
  691.  
  692. -2e+01 3e+01 -2e+01 -3e+01
  693.  
  694. 5 -6 4 5
  695.  
  696. \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
  697.  
  698. >> cat m.txt
  699.  
  700. << 1 -1 1 -1 0
  701.  
  702. << 4 -1 0 -1 0
  703.  
  704. << 2 1 -2 1 0
  705.  
  706. << 5 1 0 -4 0
  707.  
  708. << Выберите метод:
  709.  
  710. << 1)Метод Гаусса
  711.  
  712. << 2)Метод Гаусса с выбором главного элемента
  713.  
  714. << 1
  715.  
  716. << Система несовместна или имеет более одного решения
  717.  
  718. << det(A)=0
  719.  
  720. << Обратная матрица не существует
  721.  
  722.  
  723.  
  724. \newpage
  725. \chapter{Исследование вычислительной устойчивости метода
  726. Гаусса}
  727. \
  728.  
  729. Метод Гаусса не является вычислительно устойчивым. Например, для матриц Гильберта
  730. метод приводит к очень большим ошибкам даже при небольшой размерности этих матриц.
  731. Уменьшить вычислительную ошибку можно с помощью метода Гаусса с выделением
  732. главного элемента, который является условно устойчивым.
  733.  
  734. Это можно легко проверить, для этого была написана специальная функция, которая
  735. генерирует матрицу Гильберта заданного размера и свободный вектор состоящий из 1:
  736.  
  737. \begin{lstlisting}
  738. void
  739. g_matrix(double ***A, int n)
  740. {
  741. *A = calloc(n, sizeof(**A));
  742. for(int i = 0; i < n; i++)
  743. (*A)[i] = calloc(n + 1, sizeof(***A));
  744. for (int i = 1; i <= n; i++) {
  745. for (int j = 1; j <= n; j++) {
  746. (*A)[i - 1][j - 1] = 1. / (i + j - 1);
  747. }
  748. (*A)[i - 1][n] = 1;
  749. }
  750. }
  751. \end{lstlisting}
  752.  
  753. И уже на матрице размера 10 мы получаем существенные отклонения от правильного
  754. результата даже для метода Гаусса с выбором главного элемента.
  755.  
  756. Результат работы метода Гаусса:
  757. $ x = (-9.9973706711, 989.7722374956, -23755.1401375090,
  758. 240195.7620502072, -1261048.7910691723, 3783198.9648144487,
  759. -6725766.1627083644, 7000357.8211527597, -3937735.6951384256,
  760. 923673.4643101940)$
  761.  
  762. Правильный ответ:
  763.  
  764. $х = (-10, 990, -23760, 240240, -1261260, 3783780, -6726720, 7001280,
  765. -3938220, 923780) $
  766.  
  767. Как можно заметить в некоторых случаях разница с ответом доходит до сотен, а при росте
  768. порядка матрицы неточность растет еще больше, что является достаточно плохим
  769. результатом.
  770.  
  771.  
  772. \newpage
  773.  
  774. \chapter{Вывод}
  775. \
  776.  
  777. Вывод:
  778. После написания программ реализующих метод Гаусса и метод Гаусса с выбором главного
  779. элемента были проведены исследования на вычислительную устойчивость метода Гаусса.
  780. В результате исследований было выяснено, что метод Гаусса не является вычислительно
  781. устойчивым, а чтобы снизить погрешность лучше использовать метод Гаусса с выбором
  782. главного элемента. Но метод Гаусса достаточно широко используется в силу его простоты
  783. и редко встречающихся плохо обусловленных матриц на практике. Так же метод Гаусса
  784. позволяет найти детерминант матрицы коэффициентов и обратную матрицу во время
  785. решения системы.
  786.  
  787. \newpage
  788.  
  789. \chapter{Литература}
  790. \
  791. <<Вводные лекции по численным методам>> Д. П. Костомаров, А. П. Фаворский.
  792.  
  793. \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement