From 9b73fc29785152093817651010e110d8705869e7 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Sat, 9 Dec 2023 21:44:01 -0700 Subject: [PATCH] hw8 --- homeworks/hw-8.org | 288 ++++++++++++++++++++++++++++++++++++- homeworks/hw-8.pdf | Bin 0 -> 104359 bytes homeworks/hw-8.tex | 344 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 625 insertions(+), 7 deletions(-) create mode 100644 homeworks/hw-8.pdf create mode 100644 homeworks/hw-8.tex diff --git a/homeworks/hw-8.org b/homeworks/hw-8.org index f4f4ebd..92a380f 100644 --- a/homeworks/hw-8.org +++ b/homeworks/hw-8.org @@ -4,11 +4,9 @@ #+LATEX: \setlength\parindent{0pt} #+OPTIONS: toc:nil -TODO: Update LIZFCM org file with jacobi solve - * Question One See ~UTEST(jacobi, solve_jacobi)~ in ~test/jacobi.t.c~ and the entry -~Jacobi -> solve_jacobi~ in the LIZFCM API documentation. +~Jacobi / Gauss-Siedel -> solve_jacobi~ in the LIZFCM API documentation. * Question Two We cannot just perform the Jacobi algorithm on a Leslie matrix since it is obviously not diagonally dominant - which is a requirement. It is @@ -24,14 +22,290 @@ direct solution method. It's simply the nature of the Jacobi algorithm being a convergent solution that determines its accuracy. LU factorization also performs in order $O(n^3)$ runtime for an $n \times n$ -matrix, whereas the Jacobi algorithm runs in order $O(k n^2) = O(n^2)$ but with the -con that $k$ is given by the convergence criteria, which might end up worse in -some cases, than LU. +matrix, whereas the Jacobi algorithm runs in order $O(k n^2) = O(n^2)$ on average +but with the con that $k$ is given by some function on both the convergence criteria and the number of +nonzero entries in the matrix - which might end up worse in some cases than the LU decomp approach. * Question Three See ~UTEST(jacobi, gauss_siedel_solve)~ in ~test/jacobi.t.c~ which runs the same unit test as ~UTEST(jacobi, solve_jacobi)~ but using the -~Jacobi -> gauss_siedel_solve~ method as documented in the LIZFCM API reference. +~Jacobi / Gauss-Siedel -> gauss_siedel_solve~ method as documented in the LIZFCM API reference. * Question Four, Five +We produce the following operation counts (by hackily adding the operation count as the last element +to the solution vector) and errors - the sum of each vector elements' absolute value away from 1.0 +using the proceeding patch and unit test. +| N | JAC opr | JAC err | GS opr | GS err | LU opr | LU err | +| 5 | 1622 | 0.001244 | 577 | 0.000098 | 430 | 0.000000 | +| 6 | 2812 | 0.001205 | 775 | 0.000080 | 681 | 0.000000 | +| 7 | 5396 | 0.001187 | 860 | 0.000178 | 1015 | 0.000000 | +| 8 | 5618 | 0.001468 | 1255 | 0.000121 | 1444 | 0.000000 | +| 9 | 7534 | 0.001638 | 1754 | 0.000091 | 1980 | 0.000000 | +| 10 | 10342 | 0.001425 | 1847 | 0.000435 | 2635 | 0.000000 | +| 11 | 12870 | 0.001595 | 2185 | 0.000368 | 3421 | 0.000000 | +| 12 | 17511 | 0.001860 | 2912 | 0.000322 | 4350 | 0.000000 | +| 13 | 16226 | 0.001631 | 3362 | 0.000270 | 5434 | 0.000000 | +| 14 | 34333 | 0.001976 | 3844 | 0.000121 | 6685 | 0.000000 | +| 15 | 38474 | 0.001922 | 4358 | 0.000311 | 8115 | 0.000000 | +| 16 | 40405 | 0.002061 | 4904 | 0.000204 | 9736 | 0.000000 | +| 17 | 58518 | 0.002125 | 5482 | 0.000311 | 11560 | 0.000000 | +| 18 | 68079 | 0.002114 | 6092 | 0.000279 | 13599 | 0.000000 | +| 19 | 95802 | 0.002159 | 6734 | 0.000335 | 15865 | 0.000000 | +| 20 | 85696 | 0.002141 | 7408 | 0.000289 | 18370 | 0.000000 | +| 21 | 89026 | 0.002316 | 8114 | 0.000393 | 21126 | 0.000000 | +| 22 | 101537 | 0.002344 | 8852 | 0.000414 | 24145 | 0.000000 | +| 23 | 148040 | 0.002323 | 9622 | 0.000230 | 27439 | 0.000000 | +| 24 | 137605 | 0.002348 | 10424 | 0.000213 | 31020 | 0.000000 | +| 25 | 169374 | 0.002409 | 11258 | 0.000894 | 34900 | 0.000000 | +| 26 | 215166 | 0.002502 | 12124 | 0.000564 | 39091 | 0.000000 | +| 27 | 175476 | 0.002616 | 13022 | 0.000535 | 43605 | 0.000000 | +| 28 | 268454 | 0.002651 | 13952 | 0.000690 | 48454 | 0.000000 | +| 29 | 267034 | 0.002697 | 14914 | 0.000675 | 53650 | 0.000000 | +| 30 | 277193 | 0.002686 | 15908 | 0.000542 | 59205 | 0.000000 | +| 31 | 336792 | 0.002736 | 16934 | 0.000390 | 65131 | 0.000000 | +| 32 | 293958 | 0.002741 | 17992 | 0.000660 | 71440 | 0.000000 | +| 33 | 323638 | 0.002893 | 19082 | 0.001072 | 78144 | 0.000000 | +| 34 | 375104 | 0.003001 | 20204 | 0.001018 | 85255 | 0.000000 | +| 35 | 436092 | 0.003004 | 21358 | 0.000912 | 92785 | 0.000000 | +| 36 | 538143 | 0.003005 | 22544 | 0.000954 | 100746 | 0.000000 | +| 37 | 511886 | 0.003029 | 23762 | 0.000462 | 109150 | 0.000000 | +| 38 | 551332 | 0.003070 | 25012 | 0.000996 | 118009 | 0.000000 | +| 39 | 592750 | 0.003110 | 26294 | 0.000989 | 127335 | 0.000000 | +| 40 | 704208 | 0.003165 | 27608 | 0.000583 | 137140 | 0.000000 | + +#+BEGIN_SRC +diff --git a/src/matrix.c b/src/matrix.c +index 901a426..af5529f 100644 +--- a/src/matrix.c ++++ b/src/matrix.c +@@ -144,20 +144,54 @@ Array_double *solve_matrix_lu_bsubst(Matrix_double *m, Array_double *b) { + assert(b->size == m->rows); + assert(m->rows == m->cols); + ++ double opr = 0; ++ ++ opr += b->size; + Array_double *x = copy_vector(b); ++ ++ size_t n = m->rows; ++ opr += n * n; // (u copy) ++ opr += n * n; // l_empty ++ opr += n * n + n; // copy + put_identity_diagonal ++ opr += n; // pivot check ++ opr += m->cols; ++ for (size_t x = 0; x < m->cols; x++) { ++ opr += (m->rows - (x + 1)); ++ for (size_t y = x + 1; y < m->rows; y++) { ++ opr += 1; ++ opr += 2; // -factor ++ opr += 4 * n; // scale, add_v, free_vector ++ opr += 1; // -factor ++ } ++ } ++ opr += n; + Matrix_double **u_l = lu_decomp(m); ++ + Matrix_double *u = u_l[0]; + Matrix_double *l = u_l[1]; + ++ opr += n; ++ for (int64_t row = n - 1; row >= 0; row--) { ++ opr += 2 * (n - row); ++ opr += 1; ++ } + Array_double *b_fsub = fsubst(l, b); ++ ++ opr += n; ++ for (size_t x = 0; x < n; x++) { ++ opr += 2 * (x + 1); ++ opr += 1; // /= l->data[row]->data[row] ++ } + x = bsubst(u, b_fsub); +- free_vector(b_fsub); + ++ free_vector(b_fsub); + free_matrix(u); + free_matrix(l); + free(u_l); + +- return x; ++ Array_double *copy = add_element(x, opr); ++ free_vector(x); ++ return copy; + } + + Matrix_double *gaussian_elimination(Matrix_double *m) { +@@ -231,18 +265,36 @@ Array_double *jacobi_solve(Matrix_double *m, Array_double *b, + assert(b->size == m->cols); + size_t iter = max_iterations; + ++ double opr = 0; ++ ++ opr += 2 * b->size; // to initialize two vectors with the same dim of b twice + Array_double *x_k = InitArrayWithSize(double, b->size, 0.0); + Array_double *x_k_1 = + InitArrayWithSize(double, b->size, rand_from(0.1, 10.0)); + ++ // add since these wouldn't be accounter for after the loop ++ opr += 1; // iter decrement ++ opr += ++ 3 * x_k_1->size; // 1 to perform x_k_1, x_k and 2 to perform ||x_k_1||_2 + while ((--iter) > 0 && l2_distance(x_k_1, x_k) > l2_convergence_tolerance) { ++ opr += 1; // iter decrement ++ opr += ++ 3 * x_k_1->size; // 1 to perform x_k_1, x_k and 2 to perform ||x_k_1||_2 ++ ++ opr += m->rows; // row for add oprs + for (size_t i = 0; i < m->rows; i++) { + double delta = 0.0; ++ ++ opr += m->cols; + for (size_t j = 0; j < m->cols; j++) { + if (i == j) + continue; ++ ++ opr += 1; + delta += m->data[i]->data[j] * x_k->data[j]; + } ++ ++ opr += 2; + x_k_1->data[i] = (b->data[i] - delta) / m->data[i]->data[i]; + } + +@@ -251,8 +303,9 @@ Array_double *jacobi_solve(Matrix_double *m, Array_double *b, + x_k_1 = tmp; + } + +- free_vector(x_k); +- return x_k_1; ++ Array_double *copy = add_element(x_k_1, opr); ++ free_vector(x_k_1); ++ return copy; + } + + Array_double *gauss_siedel_solve(Matrix_double *m, Array_double *b, +@@ -262,30 +315,48 @@ Array_double *gauss_siedel_solve(Matrix_double *m, Array_double *b, + assert(b->size == m->cols); + size_t iter = max_iterations; + ++ double opr = 0; ++ ++ opr += 2 * b->size; // to initialize two vectors with the same dim of b twice + Array_double *x_k = InitArrayWithSize(double, b->size, 0.0); + Array_double *x_k_1 = + InitArrayWithSize(double, b->size, rand_from(0.1, 10.0)); + + while ((--iter) > 0) { ++ opr += 1; // iter decrement ++ ++ opr += x_k->size; // copy oprs + for (size_t i = 0; i < x_k->size; i++) + x_k->data[i] = x_k_1->data[i]; + ++ opr += m->rows; // row for add oprs + for (size_t i = 0; i < m->rows; i++) { + double delta = 0.0; ++ ++ opr += m->cols; + for (size_t j = 0; j < m->cols; j++) { + if (i == j) + continue; ++ ++ opr += 1; + delta += m->data[i]->data[j] * x_k_1->data[j]; + } ++ ++ opr += 2; + x_k_1->data[i] = (b->data[i] - delta) / m->data[i]->data[i]; + } + ++ opr += ++ 3 * x_k_1->size; // 1 to perform x_k_1, x_k and 2 to perform ||x_k_1||_2 + if (l2_distance(x_k_1, x_k) <= l2_convergence_tolerance) + break; + } + + free_vector(x_k); +- return x_k_1; ++ ++ Array_double *copy = add_element(x_k_1, opr); ++ free_vector(x_k_1); ++ return copy; + } +#+END_SRC + + +And this unit test: +#+BEGIN_SRC c +UTEST(hw_8, p4_5) { + printf("| N | JAC opr | JAC err | GS opr | GS err | LU opr | LU err | \n"); + + for (size_t i = 5; i < 100; i++) { + Matrix_double *m = generate_ddm(i); + double oprs[3] = {0.0, 0.0, 0.0}; + double errs[3] = {0.0, 0.0, 0.0}; + + Array_double *b_1 = InitArrayWithSize(double, m->rows, 1.0); + Array_double *b = m_dot_v(m, b_1); + double tolerance = 0.001; + size_t max_iter = 400; + + // JACOBI + { + Array_double *solution_with_opr_count = + jacobi_solve(m, b, tolerance, max_iter); + Array_double *solution = slice_element(solution_with_opr_count, + solution_with_opr_count->size - 1); + + for (size_t i = 0; i < solution->size; i++) + errs[0] += fabs(solution->data[i] - 1.0); + + oprs[0] = + solution_with_opr_count->data[solution_with_opr_count->size - 1]; + + free_vector(solution); + free_vector(solution_with_opr_count); + } + + // GAUSS-SIEDEL + { + Array_double *solution_with_opr_count = + gauss_siedel_solve(m, b, tolerance, max_iter); + Array_double *solution = slice_element(solution_with_opr_count, + solution_with_opr_count->size - 1); + + for (size_t i = 0; i < solution->size; i++) + errs[1] += fabs(solution->data[i] - 1.0); + + oprs[1] = + solution_with_opr_count->data[solution_with_opr_count->size - 1]; + + free_vector(solution); + free_vector(solution_with_opr_count); + } + + // LU-BSUBST + { + Array_double *solution_with_opr_count = solve_matrix_lu_bsubst(m, b); + Array_double *solution = slice_element(solution_with_opr_count, + solution_with_opr_count->size - 1); + + for (size_t i = 0; i < solution->size; i++) + errs[2] += fabs(solution->data[i] - 1.0); + + oprs[2] = + solution_with_opr_count->data[solution_with_opr_count->size - 1]; + + free_vector(solution); + free_vector(solution_with_opr_count); + } + free_matrix(m); + free_vector(b_1); + free_vector(b); + + printf("| %zu | %f | %f | %f | %f | %f | %f | \n", i, oprs[0], errs[0], + oprs[1], errs[1], oprs[2], errs[2]); + } +} +#+END_SRC diff --git a/homeworks/hw-8.pdf b/homeworks/hw-8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..601a75b9530985f6047846089f02484c90bdbf49 GIT binary patch literal 104359 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 MIX4O=B}Gq03cBN=GXMYp literal 0 HcmV?d00001 diff --git a/homeworks/hw-8.tex b/homeworks/hw-8.tex new file mode 100644 index 0000000..5074689 --- /dev/null +++ b/homeworks/hw-8.tex @@ -0,0 +1,344 @@ +% Created 2023-12-09 Sat 21:43 +% Intended LaTeX compiler: pdflatex +\documentclass[11pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{graphicx} +\usepackage{longtable} +\usepackage{wrapfig} +\usepackage{rotating} +\usepackage[normalem]{ulem} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{capt-of} +\usepackage{hyperref} +\notindent \notag \usepackage{amsmath} \usepackage[a4paper,margin=1in,portrait]{geometry} +\author{Elizabeth Hunt} +\date{\today} +\title{Homework 7} +\hypersetup{ + pdfauthor={Elizabeth Hunt}, + pdftitle={Homework 7}, + pdfkeywords={}, + pdfsubject={}, + pdfcreator={Emacs 28.2 (Org mode 9.7-pre)}, + pdflang={English}} +\begin{document} + +\maketitle +\setlength\parindent{0pt} + +\section{Question One} +\label{sec:orgb6d5cda} +See \texttt{UTEST(jacobi, solve\_jacobi)} in \texttt{test/jacobi.t.c} and the entry +\texttt{Jacobi / Gauss-Siedel -> solve\_jacobi} in the LIZFCM API documentation. +\section{Question Two} +\label{sec:org9786314} +We cannot just perform the Jacobi algorithm on a Leslie matrix since +it is obviously not diagonally dominant - which is a requirement. It is +certainly not always the case, but, if a Leslie matrix \(L\) is invertible, we can +first perform gaussian elimination on \(L\) augmented with \(n_{k+1}\) +to obtain \(n_k\) with the Jacobi method. See \texttt{UTEST(jacobi, leslie\_solve)} +in \texttt{test/jacobi.t.c} for an example wherein this method is tested on a Leslie +matrix to recompute a given initial population distribution. + +In terms of accuracy, an LU factorization and back substitution approach will +always be as correct as possible within the limits of computation; it's a +direct solution method. It's simply the nature of the Jacobi algorithm being +a convergent solution that determines its accuracy. + +LU factorization also performs in order \(O(n^3)\) runtime for an \(n \times n\) +matrix, whereas the Jacobi algorithm runs in order \(O(k n^2) = O(n^2)\) on average +but with the con that \(k\) is given by some function on both the convergence criteria and the number of +nonzero entries in the matrix - which might end up worse in some cases than the LU decomp approach. + +\section{Question Three} +\label{sec:org0ea87d0} +See \texttt{UTEST(jacobi, gauss\_siedel\_solve)} in \texttt{test/jacobi.t.c} which runs the same +unit test as \texttt{UTEST(jacobi, solve\_jacobi)} but using the +\texttt{Jacobi / Gauss-Siedel -> gauss\_siedel\_solve} method as documented in the LIZFCM API reference. + +\section{Question Four, Five} +\label{sec:org8eea2ae} +We produce the following operation counts (by hackily adding the operation count as the last element +to the solution vector) and errors - the sum of each vector elements' absolute value away from 1.0 +using the proceeding patch and unit test. + +\begin{center} +\begin{tabular}{rrrrrrr} +N & JAC opr & JAC err & GS opr & GS err & LU opr & LU err\\[0pt] +5 & 1622 & 0.001244 & 577 & 0.000098 & 430 & 0.000000\\[0pt] +6 & 2812 & 0.001205 & 775 & 0.000080 & 681 & 0.000000\\[0pt] +7 & 5396 & 0.001187 & 860 & 0.000178 & 1015 & 0.000000\\[0pt] +8 & 5618 & 0.001468 & 1255 & 0.000121 & 1444 & 0.000000\\[0pt] +9 & 7534 & 0.001638 & 1754 & 0.000091 & 1980 & 0.000000\\[0pt] +10 & 10342 & 0.001425 & 1847 & 0.000435 & 2635 & 0.000000\\[0pt] +11 & 12870 & 0.001595 & 2185 & 0.000368 & 3421 & 0.000000\\[0pt] +12 & 17511 & 0.001860 & 2912 & 0.000322 & 4350 & 0.000000\\[0pt] +13 & 16226 & 0.001631 & 3362 & 0.000270 & 5434 & 0.000000\\[0pt] +14 & 34333 & 0.001976 & 3844 & 0.000121 & 6685 & 0.000000\\[0pt] +15 & 38474 & 0.001922 & 4358 & 0.000311 & 8115 & 0.000000\\[0pt] +16 & 40405 & 0.002061 & 4904 & 0.000204 & 9736 & 0.000000\\[0pt] +17 & 58518 & 0.002125 & 5482 & 0.000311 & 11560 & 0.000000\\[0pt] +18 & 68079 & 0.002114 & 6092 & 0.000279 & 13599 & 0.000000\\[0pt] +19 & 95802 & 0.002159 & 6734 & 0.000335 & 15865 & 0.000000\\[0pt] +20 & 85696 & 0.002141 & 7408 & 0.000289 & 18370 & 0.000000\\[0pt] +21 & 89026 & 0.002316 & 8114 & 0.000393 & 21126 & 0.000000\\[0pt] +22 & 101537 & 0.002344 & 8852 & 0.000414 & 24145 & 0.000000\\[0pt] +23 & 148040 & 0.002323 & 9622 & 0.000230 & 27439 & 0.000000\\[0pt] +24 & 137605 & 0.002348 & 10424 & 0.000213 & 31020 & 0.000000\\[0pt] +25 & 169374 & 0.002409 & 11258 & 0.000894 & 34900 & 0.000000\\[0pt] +26 & 215166 & 0.002502 & 12124 & 0.000564 & 39091 & 0.000000\\[0pt] +27 & 175476 & 0.002616 & 13022 & 0.000535 & 43605 & 0.000000\\[0pt] +28 & 268454 & 0.002651 & 13952 & 0.000690 & 48454 & 0.000000\\[0pt] +29 & 267034 & 0.002697 & 14914 & 0.000675 & 53650 & 0.000000\\[0pt] +30 & 277193 & 0.002686 & 15908 & 0.000542 & 59205 & 0.000000\\[0pt] +31 & 336792 & 0.002736 & 16934 & 0.000390 & 65131 & 0.000000\\[0pt] +32 & 293958 & 0.002741 & 17992 & 0.000660 & 71440 & 0.000000\\[0pt] +33 & 323638 & 0.002893 & 19082 & 0.001072 & 78144 & 0.000000\\[0pt] +34 & 375104 & 0.003001 & 20204 & 0.001018 & 85255 & 0.000000\\[0pt] +35 & 436092 & 0.003004 & 21358 & 0.000912 & 92785 & 0.000000\\[0pt] +36 & 538143 & 0.003005 & 22544 & 0.000954 & 100746 & 0.000000\\[0pt] +37 & 511886 & 0.003029 & 23762 & 0.000462 & 109150 & 0.000000\\[0pt] +38 & 551332 & 0.003070 & 25012 & 0.000996 & 118009 & 0.000000\\[0pt] +39 & 592750 & 0.003110 & 26294 & 0.000989 & 127335 & 0.000000\\[0pt] +40 & 704208 & 0.003165 & 27608 & 0.000583 & 137140 & 0.000000\\[0pt] +\end{tabular} +\end{center} + +\begin{verbatim} +diff --git a/src/matrix.c b/src/matrix.c +index 901a426..af5529f 100644 +--- a/src/matrix.c ++++ b/src/matrix.c +@@ -144,20 +144,54 @@ Array_double *solve_matrix_lu_bsubst(Matrix_double *m, Array_double *b) { + assert(b->size == m->rows); + assert(m->rows == m->cols); + ++ double opr = 0; ++ ++ opr += b->size; + Array_double *x = copy_vector(b); ++ ++ size_t n = m->rows; ++ opr += n * n; // (u copy) ++ opr += n * n; // l_empty ++ opr += n * n + n; // copy + put_identity_diagonal ++ opr += n; // pivot check ++ opr += m->cols; ++ for (size_t x = 0; x < m->cols; x++) { ++ opr += (m->rows - (x + 1)); ++ for (size_t y = x + 1; y < m->rows; y++) { ++ opr += 1; ++ opr += 2; // -factor ++ opr += 4 * n; // scale, add_v, free_vector ++ opr += 1; // -factor ++ } ++ } ++ opr += n; + Matrix_double **u_l = lu_decomp(m); ++ + Matrix_double *u = u_l[0]; + Matrix_double *l = u_l[1]; + ++ opr += n; ++ for (int64_t row = n - 1; row >= 0; row--) { ++ opr += 2 * (n - row); ++ opr += 1; ++ } + Array_double *b_fsub = fsubst(l, b); ++ ++ opr += n; ++ for (size_t x = 0; x < n; x++) { ++ opr += 2 * (x + 1); ++ opr += 1; // /= l->data[row]->data[row] ++ } + x = bsubst(u, b_fsub); +- free_vector(b_fsub); + ++ free_vector(b_fsub); + free_matrix(u); + free_matrix(l); + free(u_l); + +- return x; ++ Array_double *copy = add_element(x, opr); ++ free_vector(x); ++ return copy; + } + + Matrix_double *gaussian_elimination(Matrix_double *m) { +@@ -231,18 +265,36 @@ Array_double *jacobi_solve(Matrix_double *m, Array_double *b, + assert(b->size == m->cols); + size_t iter = max_iterations; + ++ double opr = 0; ++ ++ opr += 2 * b->size; // to initialize two vectors with the same dim of b twice + Array_double *x_k = InitArrayWithSize(double, b->size, 0.0); + Array_double *x_k_1 = + InitArrayWithSize(double, b->size, rand_from(0.1, 10.0)); + ++ // add since these wouldn't be accounter for after the loop ++ opr += 1; // iter decrement ++ opr += ++ 3 * x_k_1->size; // 1 to perform x_k_1, x_k and 2 to perform ||x_k_1||_2 + while ((--iter) > 0 && l2_distance(x_k_1, x_k) > l2_convergence_tolerance) { ++ opr += 1; // iter decrement ++ opr += ++ 3 * x_k_1->size; // 1 to perform x_k_1, x_k and 2 to perform ||x_k_1||_2 ++ ++ opr += m->rows; // row for add oprs + for (size_t i = 0; i < m->rows; i++) { + double delta = 0.0; ++ ++ opr += m->cols; + for (size_t j = 0; j < m->cols; j++) { + if (i == j) + continue; ++ ++ opr += 1; + delta += m->data[i]->data[j] * x_k->data[j]; + } ++ ++ opr += 2; + x_k_1->data[i] = (b->data[i] - delta) / m->data[i]->data[i]; + } + +@@ -251,8 +303,9 @@ Array_double *jacobi_solve(Matrix_double *m, Array_double *b, + x_k_1 = tmp; + } + +- free_vector(x_k); +- return x_k_1; ++ Array_double *copy = add_element(x_k_1, opr); ++ free_vector(x_k_1); ++ return copy; + } + + Array_double *gauss_siedel_solve(Matrix_double *m, Array_double *b, +@@ -262,30 +315,48 @@ Array_double *gauss_siedel_solve(Matrix_double *m, Array_double *b, + assert(b->size == m->cols); + size_t iter = max_iterations; + ++ double opr = 0; ++ ++ opr += 2 * b->size; // to initialize two vectors with the same dim of b twice + Array_double *x_k = InitArrayWithSize(double, b->size, 0.0); + Array_double *x_k_1 = + InitArrayWithSize(double, b->size, rand_from(0.1, 10.0)); + + while ((--iter) > 0) { ++ opr += 1; // iter decrement ++ ++ opr += x_k->size; // copy oprs + for (size_t i = 0; i < x_k->size; i++) + x_k->data[i] = x_k_1->data[i]; + ++ opr += m->rows; // row for add oprs + for (size_t i = 0; i < m->rows; i++) { + double delta = 0.0; ++ ++ opr += m->cols; + for (size_t j = 0; j < m->cols; j++) { + if (i == j) + continue; ++ ++ opr += 1; + delta += m->data[i]->data[j] * x_k_1->data[j]; + } ++ ++ opr += 2; + x_k_1->data[i] = (b->data[i] - delta) / m->data[i]->data[i]; + } + ++ opr += ++ 3 * x_k_1->size; // 1 to perform x_k_1, x_k and 2 to perform ||x_k_1||_2 + if (l2_distance(x_k_1, x_k) <= l2_convergence_tolerance) + break; + } + + free_vector(x_k); +- return x_k_1; ++ ++ Array_double *copy = add_element(x_k_1, opr); ++ free_vector(x_k_1); ++ return copy; + } +\end{verbatim} + + +And this unit test: +\begin{verbatim} +UTEST(hw_8, p4_5) { + printf("| N | JAC opr | JAC err | GS opr | GS err | LU opr | LU err | \n"); + + for (size_t i = 5; i < 100; i++) { + Matrix_double *m = generate_ddm(i); + double oprs[3] = {0.0, 0.0, 0.0}; + double errs[3] = {0.0, 0.0, 0.0}; + + Array_double *b_1 = InitArrayWithSize(double, m->rows, 1.0); + Array_double *b = m_dot_v(m, b_1); + double tolerance = 0.001; + size_t max_iter = 400; + + // JACOBI + { + Array_double *solution_with_opr_count = + jacobi_solve(m, b, tolerance, max_iter); + Array_double *solution = slice_element(solution_with_opr_count, + solution_with_opr_count->size - 1); + + for (size_t i = 0; i < solution->size; i++) + errs[0] += fabs(solution->data[i] - 1.0); + + oprs[0] = + solution_with_opr_count->data[solution_with_opr_count->size - 1]; + + free_vector(solution); + free_vector(solution_with_opr_count); + } + + // GAUSS-SIEDEL + { + Array_double *solution_with_opr_count = + gauss_siedel_solve(m, b, tolerance, max_iter); + Array_double *solution = slice_element(solution_with_opr_count, + solution_with_opr_count->size - 1); + + for (size_t i = 0; i < solution->size; i++) + errs[1] += fabs(solution->data[i] - 1.0); + + oprs[1] = + solution_with_opr_count->data[solution_with_opr_count->size - 1]; + + free_vector(solution); + free_vector(solution_with_opr_count); + } + + // LU-BSUBST + { + Array_double *solution_with_opr_count = solve_matrix_lu_bsubst(m, b); + Array_double *solution = slice_element(solution_with_opr_count, + solution_with_opr_count->size - 1); + + for (size_t i = 0; i < solution->size; i++) + errs[2] += fabs(solution->data[i] - 1.0); + + oprs[2] = + solution_with_opr_count->data[solution_with_opr_count->size - 1]; + + free_vector(solution); + free_vector(solution_with_opr_count); + } + free_matrix(m); + free_vector(b_1); + free_vector(b); + + printf("| %zu | %f | %f | %f | %f | %f | %f | \n", i, oprs[0], errs[0], + oprs[1], errs[1], oprs[2], errs[2]); + } +} +\end{verbatim} +\end{document} \ No newline at end of file