{"id":33430549,"url":"https://github.com/baranovserv/mathmod","last_synced_at":"2026-06-08T02:32:06.987Z","repository":{"id":263557049,"uuid":"890773337","full_name":"BaranovSerV/mathmod","owner":"BaranovSerV","description":"Библиотека Python для численного моделирования","archived":false,"fork":false,"pushed_at":"2025-03-25T14:01:11.000Z","size":7209,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-25T15:22:37.676Z","etag":null,"topics":["chole","false-position-method","gauss-seidel","linear-algebra-library","llt","lu-decomposition","newton-method","relaxation","secant-method"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BaranovSerV.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-19T06:41:50.000Z","updated_at":"2025-03-25T14:00:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"8dd8ab07-1897-4056-b5b6-9c62cce36e81","html_url":"https://github.com/BaranovSerV/mathmod","commit_stats":null,"previous_names":["baranovserv/mathmod"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BaranovSerV/mathmod","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaranovSerV%2Fmathmod","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaranovSerV%2Fmathmod/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaranovSerV%2Fmathmod/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaranovSerV%2Fmathmod/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BaranovSerV","download_url":"https://codeload.github.com/BaranovSerV/mathmod/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BaranovSerV%2Fmathmod/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34046003,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chole","false-position-method","gauss-seidel","linear-algebra-library","llt","lu-decomposition","newton-method","relaxation","secant-method"],"created_at":"2025-11-24T08:05:51.937Z","updated_at":"2026-06-08T02:32:06.979Z","avatar_url":"https://github.com/BaranovSerV.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mathmod - библиотека программ для численного моделирования\n\n## Для просмотра работы методов можно перети в папку ```tests```\n\n## Содержание\n- [mathmod - библиотека программ для численного моделирования](#mathmod---библиотека-программ-для-численного-моделирования)\n  - [Содержание](#содержание)\n    - [Теория погрешностей](#теория-погрешностей)\n  - [Решение нелинейных уравнений](#решение-нелинейных-уравнений)\n    - [Постановка задачи](#постановка-задачи)\n    - [Основные вопросы](#основные-вопросы)\n    - [1. Метод Ньютона](#1-метод-ньютона)\n    - [2. Упрощённый метод Ньютона](#2-упрощённый-метод-ньютона)\n    - [3. Метод секущих](#3-метод-секущих)\n    - [4. Метод ложного положения](#4-метод-ложного-положения)\n    - [5. Метод бисекций](#5-метод-бисекций)\n    - [6. Метод простой итерации](#6-метод-простой-итерации)\n  - [Решение систем линейных алгебраических уравнений (СЛАУ)](#решение-систем-линейных-алгебраических-уравнений-слау)\n    - [Постановка задачи](#постановка-задачи-1)\n    - [Основные вопросы](#основные-вопросы-1)\n    - [Прямые  методы](#прямые-методы)\n      - [1. Метод Гаусса (схема единственного деления)](#1-метод-гаусса-схема-единственного-деления)\n      - [2. Метод Гаусса (схема частичного выбора)](#2-метод-гаусса-схема-частичного-выбора)\n      - [3. Метод Холецкого (LLT-разложение)](#3-метод-холецкого-llt-разложение)\n      - [4. Метод LU-разложения](#4-метод-lu-разложения)\n      - [5. Метод прогонки](#5-метод-прогонки)\n    - [Итерационные методы](#итерационные-методы)\n      - [1. Метод Якоби](#1-метод-якоби)\n      - [2. Метод Гаусса-Зейделя](#2-метод-гаусса-зейделя)\n      - [3. Метод релаксации](#3-метод-релаксации)\n    - [Приближение функций](#приближение-функций)\n      - [Постановка задачи](#постановка-задачи-2)\n      - [Постановка задачи интерполяции](#постановка-задачи-интерполяции)\n      - [Полиномиальная интерполяция. Многочлен Лагранжа](#полиномиальная-интерполяция-многочлен-лагранжа)\n      - [Интерполяционный многочлен Ньютона с конечными разностями](#интерполяционный-многочлен-ньютона-с-конечными-разностями)\n      - [Метод наименьших квадратов](#метод-наименьших-квадратов)\n  - [Установка](#установка)\n\n---\n\n### Теория погрешностей \n\nПусть $a$ - точное решение. $a^{\\ast}$ - приближенное значение. Тогда абсолютная погрешность:\n\n**Абсолютная погрешность:**\n\n$$\n\\Delta(a^{\\ast}) = |a - a^{\\ast}|\n$$\n\n**Относительная погрешность:**\n\n$$\n\\delta(a^{\\ast}) = \\frac{|a - a^{\\ast}|}{|a|} = \\frac{\\Delta(a^{\\ast})}{|a|}\n$$\n\n**Верная цифра** - значащая цифра числа $a^{\\ast}$, абсолютная погрешность которой не превосходит единицы разряда, соответствующей этой цифре.\n\n**Округление** - замена числа $a$ его другим числом $a^{\\ast}$ с меньшим количеством значащих цифр.\n\nПри округлении возникает *погрешность округления*.\n\n## Решение нелинейных уравнений\n\n### Постановка задачи\n\nЗадача отыскания корней нелинейного  уравнения с одним неизвестным вида:\n\n$$\nf(x) = 0\n$$\n\n**Корень уравнения** - значение $\\overline{x}$, при котором $f(\\overline{x}) = 0$. Геометрически, $\\overline{x}$ является абсциссой точки пересечения графика $f(x)$ с осью $Ox$.\n\nДля заданной точности $\\epsilon$ требуется найти приближенное значение корня $\\overline{x}^{*}$ такое, что:\n\n$$\n|\\overline{x} - \\overline{x}^{*}| \\leq \\epsilon\n$$\n\nПусть функция $f(x)$ *дифференцируема* $m \u003e 1$ раз в точке $\\overline{x}$, тогда:\n\n**Простой корень** - корень уравнения  $\\overline{x}$ называется простым, если $f'(\\overline{x}) \\neq 0$.\n\n**Кратный корень** - корень уравнения  $\\overline{x}$ называется простым, если $f'(\\overline{x}) = 0$. Целое  число $m$ назовем кратностью корня $\\overline{x}$, если $f^{(k)}(\\overline{x}) = 0$, для $k = 1, 2, ..., m - 1$ и $f^{(m)}(\\overline{x}) \\neq 0$.\n\n**Этапы решения уравнения:**\n1. Локализация корня;\n2. Вычисление корня с заданной точностью.\n\n**Отрезок локализации** - отрезок $[a, b]$, который содержит 1 корень уравнения.\n\n### Основные вопросы\n\n**Сходящийся итерационный процесс** - метод отыскания корня $\\overline{x}$, заключающийся в построении последовательности приближений к нему $x^{(0)}, x^{(1)}, ..., , x^{(k)}, ...$ такой, что:\n\n$$\n\\lim_{k \\to \\infty} x^{(k)} = \\overline{x}\n$$\n\n**Порядок сходимости:**\n\nПусть в некоторой малой окрестности корня  $\\overline{x}$ уравнения $f(x) = 0$ итерационная поледовательность удовлетворяет неравенству:\n\n$$\n|\\overline{x} - x^{(k)}| \\leq C|\\overline{x} - x^{(k - 1)}|^{p}\n$$\n\n, где $С \u003e 0$ и $p \\geq 1$ - постоянные. Тогда $p$ называется *порядком сходимости*.\n\n*Порядок сходимости* - скорость уменьшения погрешности между последовательными приближениями решения. \n\n**Одношаговый итерационный метод** - метод, у которого очередное приближение $x^{(k + 1)}$ находится только через одно предыдущее $x^{(k)}$. Для его работы нужно знать только одно начальное приближение $x^{(0)}$. (Пример - *метод Ньютона*)\n\n**Многошаговый итерационный метод ($l$ - шаговый)** - метод, у которого очередное  приближение $x^{(k + 1)}$ находится $l$ предыдущих $x^{(k)}, x^{(k - 1)}, ...,  x^{(k - l + 1)}$. Для него следует задать $l$ начальных приближений $x^{(0)}, x^{(1)}, ..., x^{(l - 1)}$. (Пример - *метод секщих*)\n\n\n**Интервал неопределенности** - окрестность $(\\overline{x} - \\epsilon, \\overline{x} + \\epsilon)$ внутри которой любую точку можно принять за приближение к корню.\n\n![Интерал неопределенности](images/obus.png)\n\n### 1. Метод Ньютона\n- Быстрый итерационный метод для нахождения корня уравнения  $f(x) = 0$.\n- Требует предоставления функции $f(x)$ и её производной $f'(x)$.\n- **Функция:** `newton(f, df, x, epsilon=1e-6)`\n- **Описание параметров:**\n  - `f` - Функция, корень которой нужно найти;\n  - `df` - Производная функции;\n  - `x` - Начальное приближение корня;\n  - `epsilon` - Заданная точность (по умолчанию $10^{-6}$). \n\n```python\nfrom mathmod.nonlinear_equations import newton\n\nx, iteration = newton(f, df, x, epsilon=1e-6)\n```\n\n\u003cb\u003eРасчетная формула:\u003c/b\u003e\n  \n$$\nx^{(n+1)} = x^{(n)} - \\frac{f(x^{(n)})}{f'(x^{(n)})}\n$$\n\n\u003cb\u003eСходимость метода:\u003c/b\u003e \u003ci\u003eквадратичная\u003c/i\u003e (при выборе начального приближения из достаточно малой окрестности).\n\n\u003cb\u003eКритерий окончания:\u003c/b\u003e\n\n$$\n|x^{(n+1)} - x^{(n)}| \u003c \\varepsilon\n$$\n\n![Метод Ньютона](images/Newton.png)\n\n### 2. Упрощённый метод Ньютона\n- Упрощённая версия метода Ньютона, где производная функции вычисляется только один раз.\n- **Функция:** `simplified_newton(f, df, x0, epsilon=1e-6)`\u003cbr\u003e\n- **Описание параметров:**\n  - `f` - Функция, корень которой нужно найти;\n  - `df` - Производная функции;\n  - `x` - Начальное приближение корня;\n  - `epsilon` - Заданная точность (по умолчанию $10^{-6}$). \n  \n```python\nfrom mathmod.nonlinear_equations import simplified_newton\n\nx, iteration = simplified_newton(f, df, x0, epsilon=1e-6)\n```\n\n\u003cb\u003eРасчетная формула:\u003c/b\u003e\n  \n$$\nx^{(n+1)} = x^{(n)} - \\frac{f(x^{(n)})}{f'(x^{(0)})}\n$$\n\n\u003cb\u003eСходимость метода:\u003c/b\u003e скорость сходимости тем выше, чем ближе начальное приближение $x^{(0)}$ к решению $\\overline{x}$.\n\n\u003cb\u003eКритерий окончания:\u003c/b\u003e\n\n$$\n|x^{(n+1)} - x^{(n)}| \u003c \\varepsilon\n$$\n\n![Упрощенный метод Ньютона](images/simplif_newton.png)\n\n### 3. Метод секущих\n- Не требует аналитической производной функции.\n- Использует приближённую производную.\n- **Функция:** `secant(f, x_minus_1, x_n, epsilon=1e-6)`\n- **Описание параметров:**\n  - `f` -  Функция, корень которой нужно найти;\n  - `x_minus_1` - Первой начальное приближение;\n  - `x` - Второе начальное приближение;\n  - `epsilon` - Заданная точность (по умолчанию $10^{-6}$). \n\n```python\nfrom mathmod.nonlinear_equations import secant\n\nx, iteration = secant(f, x_minus_1, x_n, epsilon=1e-6)\n```\n\n\u003cb\u003eРасчетная формула:\u003c/b\u003e\n  \n$$\nx^{(n+1)} = x^{(n)} - \\frac{x^{(n-1)} - x^{(n)}}{f(x^{(n-1)}) - f(x^{(n)})} f(x^{(n)})\n$$\n\n\u003cb\u003eСходимость метода:\u003c/b\u003e $p = \\frac{\\sqrt{5} + 1}{2} \\approx\n1.618$ - \u003ci\u003eсверхлинейная\u003c/i\u003e, если вычисляется простой корень. При неудачном выборе приближения, метод расходится. Поэтому требуется выбор двух близких к $\\overline{x}$ начальных приближений $x^{(0)}$ и $x^{(1)}$.\n\n\u003cb\u003eКритерий окончания:\u003c/b\u003e\n\n$$\n|x^{(n+1)} - x^{(n)}| \u003c \\varepsilon\n$$\n\n![Метод секущих](images/secant.png)\n![Метод секущих](images/secant2.png)\n\n### 4. Метод ложного положения\n\n- **Функция:** `false_position(f, a, b, epsilon=1e-6)`\n- **Описание параметров:**\n- `f`: Функция, корень которой нужно найти;\n- `a`: Левый конец начального отрезка локализации корня;\n- `b`: Правый конец начального отрезка локализации корня;\n- `epsilon`: Заданная точность (по умолчанию $10^{-6}$).\n\n```python\nfrom mathmod.nonlinear_equations import false_position\n\nx, iteration = false_position(f, a, b, epsilon=1e-6)\n```\n\n\u003cb\u003eРасчетная формула:\u003c/b\u003e\n  \n$$\nx^{(n+1)} = x^{(n)} - \\frac{c - x^{(n)}}{f(c) - f(x^{(n)})} f(x^{(n)})\n$$\n\n, где $c$ - некторая точнка из окрестности корня. \n\n\u003cb\u003eСходимость метода:\u003c/b\u003e \u003ci\u003eлинейная\u003c/i\u003e. Для достижения заданной точности требуется тем меньше итераций, чем ближе к корню лежит точка $c$.\n\n\u003cb\u003eКритерий окончания:\u003c/b\u003e\n\n$$\n|x^{(n+1)} - x^{(n)}| \u003c \\varepsilon\n$$\n![Метод ложного положения](images/false_position.png)\n\n\n### 5. Метод бисекций\n- Работает на основе деления отрезка, учитывая значения функции.\n- Требует, чтобы начальный отрезок $[a, b]$ удовлетворял условию $f(a) * f(b) \u003c 0$.\n**Функция:** `bisection(f, a, b, epsilon)`\n\n**Описание параметров:**\n- `f` - Функция, корень которой нужно найти;\n- `a` - Левый конец начального отрезка локализации корня;\n- `b` - Правый конец начального отрезка локализации корня;\n- `epsilon` - Заданная точность (по умолчанию $10^{-6}$).\n\n```python\nfrom mathmod.nonlinear_equations import bisection\n\nx, iteration = bisection(f, a, b, epsilon=1e-6)\n```\n\n**Расчетная формула:**\n\n$$\nc = \\frac{a + b}{2}\n$$\n\n**Сходимость метода:** со скоростью геометрической прогрессии, знаменатель которой $q = \\frac{1}{2}$.\n\n**Критерий окончания:**\n\n$$\n{b^{(n)} - a^{(n)}} \u003c 2\\varepsilon\n$$\n\nТогда $x^{(n)} = \\frac{ a^{(n)} + b^{(n)} }{2}$ является искомым приближением к корню с точностью $\\epsilon$.\n\n![Метод бисекций](images/bisection.png)\n\n### 6. Метод простой итерации\n**Функция:** `simple_iteration_method(phi, x0, epsilon=1e-6)`\n\n**Описание параметров:**\n- `phi` - Итерационная функция $\\phi(x)$, преобразующая исходное уравнение $f(x) = 0$ к виду $x = \\phi(x)$;\n- `x0` - Начальное приближение корня;\n- `epsilon` - Заданная точность (по умолчанию  $10^{-6}$).\n\n```python\nfrom mathmod.nonlinear_equations import simple_iteration_method\n\nx, iteration = simple_iteration_method(phi, x0, epsilon=1e-6)\n```\n\n**Расчетная формула:**\n\n$$\nx^{(n + 1)} = \\phi(x^{(n)})\n$$\n\n**Теорема о сходимости:** \n\nЕсли в окрестности корня функция $\\phi(x)$ непрерывно дифференцируема и удовлетворяет условию:\n\n$$\n\\max_{x \\in [a, b]} |\\phi(x)| \\leq q \n$$\n\nгде $0 \\leq q \u003c 1$ - постоянная \n\nТогда независимо от выбора начального приближения $x^{(0)}$ из указанной окрестности корня итерационная последовательность не выходит из этой окрестности, метод сходится со скоростью геометрической прогресии и справедлива следующая оценка погрешности (априорная оценка):\n\n**Априорная оценка** - показывет, что итерационный метод сходится\n\n$$\n|x^{(n)} - \\overline{x}| \\leq q^{n}|x^{(0)} - \\overline{{x}}|\n$$\n\nЧем меньше $q$, тем выше скорость сходимости.\n\n**Апостериорная оценка** - критерий окончания итерационного процесса \n\n$$\n|x^{(n)} - x^{(n-1)}| \\leq \\frac{1 - q}{q}\\epsilon\n$$\n\nЕсли это условие выполнено, то можно считать, что $x^{(n)}$ является приближением к $\\overline{x}$ с точностью $\\epsilon$.\n\n![Метод простой итерации](images/MPI1.png)\n\n\n## Решение систем линейных алгебраических уравнений (СЛАУ)\n\n### Постановка задачи\n\nСистема уравнений в общем виде:\n\n$$\n\\begin{aligned}\n    a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + \\dots + a_{1m}x_m \u0026= b_1, \\\\\n    a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + \\dots + a_{2m}x_m \u0026= b_2, \\\\\n    a_{31}x_1 + a_{32}x_2 + a_{33}x_3 + \\dots + a_{3m}x_m \u0026= b_3, \\\\\n    \u0026\\dots \\\\\n    a_{m1}x_1 + a_{m2}x_2 + a_{m3}x_3 + \\dots + a_{mm}x_m \u0026= b_m.\n\\end{aligned}\n$$\n\n\nВ матричной форме эта система принимает вид:\n\n$$\nA \\mathbf{x} = \\mathbf{b}\n$$\n\n\n, где\n\n$$\nA = \n\\begin{bmatrix}\n    a_{11} \u0026 a_{12} \u0026 a_{13} \u0026 \\dots \u0026 a_{1m} \\\\\n    a_{21} \u0026 a_{22} \u0026 a_{23} \u0026 \\dots \u0026 a_{2m} \\\\\n    a_{31} \u0026 a_{32} \u0026 a_{33} \u0026 \\dots \u0026 a_{3m} \\\\\n    \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \\\\\n    a_{m1} \u0026 a_{m2} \u0026 a_{m3} \u0026 \\dots \u0026 a_{mm}\n\\end{bmatrix}, \\quad\n\\mathbf{x} =\n\\begin{bmatrix}\n    x_1 \\\\\n    x_2 \\\\\n    x_3 \\\\\n    \\vdots \\\\\n    x_m\n\\end{bmatrix}, \\quad\n\\mathbf{b} =\n\\begin{bmatrix}\n    b_1 \\\\\n    b_2 \\\\\n    b_3 \\\\\n    \\vdots \\\\\n    b_m\n\\end{bmatrix}\n$$\n\n$m$ - порядок матрицы;\n\n$A$ - невырожденная матрица ($\\Delta A \\neq 0$, т.е. $\\exists$ единственное решение);\n\n$x$ - вектор неизвестных;\n\n$b$ - вектор свободных членов; \n\nПусть $\\overline{{x}}$ - точное решение, $x^{\\ast}$ - приближенное решение.\n\n$$\n\\mathbf{\\overline{{x}}} =\n\\begin{bmatrix}\n    \\overline{{x}}_1 \\\\\n    \\overline{{x}}_2 \\\\\n    \\overline{{x}}_3 \\\\\n    \\vdots \\\\\n    \\overline{{x}}_m\n\\end{bmatrix}  \\quad\n\\mathbf{x^{\\ast}} =\n\\begin{bmatrix}\n    x^{\\ast}_1 \\\\\n    x^{\\ast}_2 \\\\\n    x^{\\ast}_3 \\\\\n    \\vdots \\\\\n    x^{\\ast}_m\n\\end{bmatrix}\n$$\n\nТогда вектор $\\epsilon = \\overline{{x}} - x^{*}$ называется вектором погрешности.\n\n\u003cb\u003eЗадача:\u003c/b\u003e \n\nНайти решение системы $Ax = b$ с точностью $\\epsilon$. Это означает, что нужно найти вектор $x^{\\ast}$ такой, что $|| \\overline{{x}} - x^{*} || \\leq \\epsilon$, где $|| \\cdot ||$ - одна из норм (единичная, евклидова, бесконечности).\n\n\n### Основные вопросы\n\n**Прямой метод** - метод, который позволяет получить решение после выполнения конечного числа элементарных операций;\n\n**Итерационный метод** - метод, который строит последовательность приближений к решению;\n\n**Норма** - будем говорить, что в $R^{m}$ введена норма, если каждому вектору $x \\in R^{m}$ сопоставлено вещественное число, обозначаемое $||x||$.\n\n1. **Нормы векторов:**\n\n   ![Нормы векторов](images/norms.png)\n\n   *Свойства норм векторов:*\n\n   ![Свойства норм векторов](images/sv_vec.png)\n\n2. **Нормы матриц:**\n\n   ![Нормы матриц](images/norm_mat.png)\n\n   *Свойства норм матриц:*\n\n   ![Свойства норм матриц](images/sv_mat.png)\n\n3. **Абсолютна и относительная погрешность векторов и матриц:**\n\n* Погрешность векторов:\n\n   $\\Delta x^{\\ast} = ||\\overline{x} - x^{\\ast}||$ - абсолютная погрешность;\n\n   $\\delta x^{\\ast} = \\frac{\\Delta x^{\\ast}}{||x^{\\ast}||}$ - относительная погрешность;\n\n4. **Вектор невязки** - вектор, показывающий насколько найденное решение СЛАУ отклоняется от точного решения.\n\n$$\nr = b - A x^{\\ast}\n$$\n\n**Число обусловленности** - коэффициент возможного возрастания относительной погрешности решения, вызванное погрешностью задания правой части.\n\nПусть $\\overline{x}$ - точное решение системы $A \\overline{x} = b$, а $x^{\\ast}$ - решение системы. Тогда верны следующие оценки:\n\n$$\n\\delta(x^{\\ast}) \\leq \\nu_\\delta (\\delta(A^{\\ast}) + \\delta(b^{\\ast}))\n$$\n\n, где\n\n$$\n\\nu_\\delta = ||A|| * ||A^{-1}|| \\quad\n\\delta(A^{\\ast}) = \\frac{||A - A^{-1}||}{||A||}|\n$$\n\n$\\nu(A) = cond(A) = ||A^{-1}|| * ||A||$ - стандартное число обусловленности.\n\nМатрица *плохо* обусловлена, если $cond(A) \u003e\u003e 1$. Следовательно, тогда существует решение, обладающее черезвычайно высокой чувствительностью к малым погрешностям входного данного $b$.\n\n### Прямые методы\n\n**Прямой метод** - метод, который позволяет получить решение после выполнения конечного числа элементарных операций.\n\n#### 1. Метод Гаусса (схема единственного деления)\n\n- **Функция:** `gauss_single_division(A, b)`\n  \n- `A` - Матрица левой части;\n- `b` - Вектор правой части;\n  \n**Трудоемкость метода** - $\\frac{2}{3} m^{3}$\n\n- Прямой ход - матрица $A$ преобразуется к треугольному виду ($m - 1$ - шагов).\n- Обратный ход - вычисляются значения неизвестных, начиная с последнего уравнения ($m^{2}$ - шагов).\n\n**Условие применимости** - схема единственного деления не может быть реализована, если один из главных элементов равен нулю. \n\n**Описание метода:**\n\n![Метод Гаусса (схема единственного деления)](images/single1.png)\n\n![Метод Гаусса (схема единственного деления)](images/single2.png)\n\n![Метод Гаусса (схема единственного деления)](images/single3.png)\n\n```python\nfrom mathmod.linear_systems import gauss_single_division\n\nx = gauss_single_division(A, b)\n```\n\n---\n\n**Пример:**\n\n$$\n\\begin{aligned}\n2x_1 + x_2 - x_3 \u0026= 1, \\\\\n4x_1 + 3x_2 - x_3 \u0026= 7, \\\\\n8x_1 + 7x_2 + 3x_3 \u0026= 25.\n\\end{aligned}\n$$\n\nВ матричной форме система записывается так:\n\n$$\n\\left[\n\\begin{array}{ccc|c}\n2 \u0026 1 \u0026 -1 \u0026 1 \\\\\n4 \u0026 3 \u0026 -1 \u0026 7 \\\\\n8 \u0026 7 \u0026 3 \u0026 25\n\\end{array}\n\\right]\n$$\n\n**Прямой ход**\n\nШаг 1: Приведение первого столбца\n\nДелим первую строку на ведущий элемент $a_{11} = 2$:\n\n$$\n\\left[\n\\begin{array}{ccc|c}\n1 \u0026 0.5 \u0026 -0.5 \u0026 0.5 \\\\\n4 \u0026 3 \u0026 -1 \u0026 7 \\\\\n8 \u0026 7 \u0026 3 \u0026 25\n\\end{array}\n\\right]\n$$\n\nОбнуляем элементы ниже ведущего элемента в первом столбце, используя формулу:\n\n$$\na_{ij} \\gets a_{ij} - \\mu_{ik} \\cdot a_{kj}, \\quad b_i \\gets b_i - \\mu_{ik} \\cdot b_k,\n$$\n\n, где  $\\mu_{ik} = \\frac{a_{ik}}{a_{kk}}$\n\nДля второй строки:\n\n$$\n\\mu_{21} = 4, \\quad a_{2j} \\gets a_{2j} - 4 \\cdot a_{1j}\n$$\n\nДля третьей строки:\n\n$$\n\\mu_{31} = 8, \\quad a_{3j} \\gets a_{3j} - 8 \\cdot a_{1j}\n$$\n\nПолучаем:\n\n$$\n\\left[\n\\begin{array}{ccc|c}\n1 \u0026 0.5 \u0026 -0.5 \u0026 0.5 \\\\\n0 \u0026 1 \u0026 1 \u0026 5 \\\\\n0 \u0026 3 \u0026 7 \u0026 21\n\\end{array}\n\\right]\n$$\n\nШаг 2: Приведение второго столбца\n\nДелим вторую строку на ведущий элемент  $a_{22} = 1$ (он уже равен $1$):\n\n$$\n\\left[\n\\begin{array}{ccc|c}\n1 \u0026 0.5 \u0026 -0.5 \u0026 0.5 \\\\\n0 \u0026 1 \u0026 1 \u0026 5 \\\\\n0 \u0026 3 \u0026 7 \u0026 21\n\\end{array}\n\\right]\n$$\n\nОбнуляем элементы ниже ведущего элемента во втором столбце:\n\n$$\n\\mu_{32} = 3, \\quad a_{3j} \\gets a_{3j} - 3 \\cdot a_{2j}\n$$\n\nПолучаем:\n\n$$\n\\left[\n\\begin{array}{ccc|c}\n1 \u0026 0.5 \u0026 -0.5 \u0026 0.5 \\\\\n0 \u0026 1 \u0026 1 \u0026 5 \\\\\n0 \u0026 0 \u0026 4 \u0026 6\n\\end{array}\n\\right]\n$$\n\n**Обратный ход**\n\nРешаем треугольную систему методом подстановки.\n\nШаг 1: Найдем $x_3$:\n\n$$\nx_3 = \\frac{6}{4} = 1.5\n$$\n\nШаг 2: Найдем $x_2$:\n\n$$\nx_2 = 5 - 1 \\cdot x_3 = 5 - 1 \\cdot 1.5 = 3.5\n$$\n\nШаг 3: Найдем $x_1$:\n\n$$\nx_1 = 0.5 - 0.5 \\cdot x_2 - 0.5 \\cdot x_3 = 0.5 - 0.5 \\cdot 3.5 + 0.5 \\cdot 1.5 = -0.5\n$$\n\n**Решение системы:**\n\n$$\nx_1 = -0.5, \\quad x_2 = 3.5, \\quad x_3 = 1.5\n$$\n\n---\n\n#### 2. Метод Гаусса (схема частичного выбора)\n- **Функция:** `gauss_partial_pivot(a, b)`\n\n**Трудоемкость метода** - $\\frac{2}{3} m^{3}$\n\n**Описание метода:**\n\n![Метод Гаусса (схема частичного деления)](images/gauss.png)\n\nОтличие от *схемы единственного деления* заключается в том, что на $k$-м шаге исключение в качестве главного элемента выбирают **максимальный** по модулю коэффициент $a_{i_{k}k}$. \n\n**Вычислительная устойчивость:**\n\nГарантия ограниченности  роста элементов матрицы делает схему частиного выбора вычислительно устойчивой. Становится справедлива оценка погрешности:\n\n$$\n\\delta(x^{\\ast}) \\lesssim f(m) cond_E(A) \\epsilon_M\n$$\n\n, где:\n\n$x^{\\ast}$ - вычисленное ЭВМ решение системы. $\\delta(x^{\\ast}) = \\frac{||x - x^{\\ast}||_2}{||x||_2}$ - относительная погрешность;\n\n$cond_E(A) = ||A||_E||A^{-1}||_E$ - числро обусловленности;\n\n$\\epsilon_M$ - машинный эпсилон;\n\n$f(m) = C(m)\\phi(m)$, где $C(m)$ - некоторая медленно растущая функция, зависящая от порядка стистемы;\n\n$\\phi(m)$ - коэффициент роста.\n\nДалее исключение неизвестного $x_{k}$ производят, как в схеме единственного деления. \n\n```python\nfrom mathmod.linear_systems import gauss_partial_pivot\n\nx = gauss_partial_pivot(A,b)\n```\n\n---\n\n**Пример:**\n\nРассмотрим систему:\n\n$$\nA = \n\\begin{bmatrix}\n2 \u0026 -9 \u0026 5 \\\\\n0 \u0026 3.5 \u0026 -10 \\\\\n0 \u0026 0.0001 \u0026 3\n\\end{bmatrix} \\quad\nb = \n\\begin{bmatrix}\n-4\\\\\n-6.5\\\\\n3.0001\n\\end{bmatrix}\n$$\n\n![Метод Гаусса (схема частичного деления)](images/gauss2.png)\n\n---\n\n#### 3. Метод Холецкого (LLT-разложение)\n- Для решения СЛАУ с симметрично положительно определённой матрицей.\n- **Функция:** `cholecky(A, b)`\n\n**Трудоемкость метода** - $\\frac{1}{3}m^{3}$\n\n**Условия применимости** - требуется, чтобы диагональные элементы $l_{ii}$ матрицы $L$ были положительными.\n\n**Достоинства метода:**\n\n- Гарантированная устойчивость;\n- Требует вдвое меньше вычислительных затрат по сравнению с методом Гаусса;\n- Позволяет экономично использовать память ЭВМ при записи исходных данных и результато вычислений за счет симметричности матрицы A.\n\n**Описание метода:**\n\n$A$ - симетрично положительно определенная матроица ($A = A^{T}$ и $\\forall x \\neq 0$ скалярное произведение $(Ax, x) \u003e 0$ ). \n\n$L$ - нижнетреугольная матрица. $L^{T}$ - транспонированная.\n\n$$\nA = LL^{T}\n$$\n\n, где\n\n$$\nLL^{T} = \n\\begin{bmatrix}\nl_{11} \u0026 0 \u0026  0 \u0026 \\dots \u0026 0\\\\\nl_{21} \u0026 l_{22} \u0026 0 \u0026 \\dots \u0026 0\\\\\nl_{31} \u0026 l_{32} \u0026 l_{33} \u0026 \\dots \u0026 0 \\\\\n\\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \\\\\nl_{m1} \u0026 l_{m2} \u0026 l_{m3} \u0026 \\dots \u0026 l_{mm} \\\\\n\\end{bmatrix} \\cdot\n\\begin{bmatrix}\nl_{11} \u0026 l_{21} \u0026  l_{31} \u0026 \\dots \u0026 l_{m1}\\\\\n0 \u0026 l_{22} \u0026 l_{23} \u0026 \\dots \u0026 l_{m2}\\\\\n0 \u0026 0 \u0026 l_{33} \u0026 \\dots \u0026 l_{m3} \\\\\n\\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \\\\\n0 \u0026 0 \u0026 0 \u0026 \\dots \u0026 l_{mm} \\\\\n\\end{bmatrix} =\n\\begin{bmatrix}\n    a_{11} \u0026 a_{12} \u0026 a_{13} \u0026 \\dots \u0026 a_{1m} \\\\\n    a_{21} \u0026 a_{22} \u0026 a_{23} \u0026 \\dots \u0026 a_{2m} \\\\\n    a_{31} \u0026 a_{32} \u0026 a_{33} \u0026 \\dots \u0026 a_{3m} \\\\\n    \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \\\\\n    a_{m1} \u0026 a_{m2} \u0026 a_{m3} \u0026 \\dots \u0026 a_{mm}\n\\end{bmatrix}\n$$\n\nОтсюда: \n\n$$\nl^2_{k1} + l^2_{k2} + \\dots + l^2_{kk} = a_{kk} \n$$ \n\n$$\nl_{kk} = \\sqrt{a_{kk} - \\sum_{j=1}^{k-1} l^{2}_{k,j}} \\quad k = 2 \\dots m\n$$\n\n$$\nl_{ik} = \\frac{a_{i,k} - \\sum_{j-1}^{k-1} l_{i,j} \\cdot l_{l,k}}{l_{k,k}} \\quad i = k + 1, \\dots m\n$$\n\nЕсли разложение получено, то решение системы:\n\n$$\nLy = b \\quad \nL^{T}x = y\n$$\n\n```python\nfrom mathmod.linear_systems import cholecky\n\nx = cholecky(A, b)\n```\n\n---\n\n**Пример:**\n\nРассмотрим систему:\n\n$$\nA = \n\\begin{bmatrix}\n6.25 \u0026 -1 \u0026 0.5 \\\\\n-1 \u0026 5 \u0026 2.12 \\\\\n0.5 \u0026 2.12 \u0026 3.6\n\\end{bmatrix} \\quad\nb = \n\\begin{bmatrix}\n7.5\\\\\n-8.68\\\\\n-0.24\n\\end{bmatrix}\n$$\n\n$l_{11} = \\sqrt(a_{11}) = \\sqrt{6.25} = 2.5 \\quad l_{21} = \\frac{a_{21}}{l_{11}}  =\\frac{-1}{2.5} = -0.4$\n\n$l_{31} = \\frac{a_{31}}{l_{11}} = \\frac{0.5}{2.5}   = 0.2 \\quad l_{22} = \\sqrt{a_{22} - l_{21}^{2}} = \\sqrt{5 - 0.16} = 2.2$\n\n$l_{32} = a_{32} - l_{31}l_{21} = (2.12 - \\frac{0.2 \\cdot (-0.4)}{2.2}) = 1$\n\n$l_{33} = \\sqrt{a_{22} - l_{31}^{2} - l_{32}^{2}} = \\sqrt{3.6 - 0.2^{2} - 1^{2}} = 1.6$\n\nМатрица $L$:\n\n$$\nL = \n\\begin{bmatrix}\n2.25 \u0026 0 \u0026 0 \\\\\n-0.4 \u0026 2.2 \u0026 0 \\\\\n0.2 \u0026 1 \u0026 1.6\n\\end{bmatrix}\n$$\n\nРешение состоит из 2-х шагов:\n\n1. Решаем $Ly = b$ для $y$ методом прямой подстановки.\n2. Решаем $L^{T}x = y$ для $x$ методом обратной подстановки.\n\nРешение:\n\n1. Прямой ход для $y$:\n   \n$$\nLy = b\n$$\n\n$$\n\\begin{bmatrix}\n2.5 \u0026 0 \u0026 0 \\\\\n-0.4 \u0026 2.2 \u0026 0 \\\\\n0.2 \u0026 1 \u0026 1.6\n\\end{bmatrix} \\cdot \n\\begin{bmatrix}\ny_1\\\\\ny_2\\\\\ny_3\n\\end{bmatrix} =\n\\begin{bmatrix}\n7.5\\\\\n-8.68\\\\\n-0.24\n\\end{bmatrix}\n$$\n\n- Рассчитываем $y$:\n\n$$\n\\begin{aligned}\n2.5 \\cdot y_1 \u0026= 7.5, \\\\\n-0.4 \\cdot y_1 + 2.2 \\cdot y_2 \u0026= -8.68, \\\\\n0.2 \\cdot y_1 + y_2 + 1.6 \\cdot y_3 \u0026= -0.24 \\\\\n\\end{aligned}\n$$\n\n- Решая, получаем:\n\n$$\ny_1 = 3, \\\\\ny_2 = -3.4, \\\\\ny_3 = 1.6 \\\\\n$$\n\n2. Обратный ход для $x$:\n   \n$$\nL^{T}x = y\n$$\n\n$$\n\\begin{bmatrix}\n2.5 \u0026 -0.4 \u0026 0.2 \\\\\n0 \u0026 2.2 \u0026 1 \\\\\n0 \u0026 0 \u0026 1.6\n\\end{bmatrix} \\cdot \n\\begin{bmatrix}\nx_1\\\\\nx_2\\\\\nx_3\n\\end{bmatrix} =\n\\begin{bmatrix}\n3\\\\\n-3.4\\\\\n1.6\n\\end{bmatrix}\n$$\n\n- Рассчитывем $x$:\n\n$$\n\\begin{aligned}\n2.5 \\cdot x_1 -0.4 \\cdot x_2 + 0.2 \\cdot x_3 \u0026= 3, \\\\\n2.2 \\cdot x_2 + x_3 \u0026= -3.4, \\\\\n1.6 \\cdot x_3 \u0026= 1.6.\n\\end{aligned}\n$$\n\n- Решая, получаем:\n\n$$\nx_1 = 0.8, \\quad\nx_2 = -2, \\quad\nx_3 = 1 \\quad\n$$\n\n\n\n\n---\n\n#### 4. Метод LU-разложения\n- **Функция:** `lu(A, b)`\n\n**Трудоемкость метода** - $\\frac{2}{3} m^{3} + m^{2}$\n\n**Теорема о возможности применения $LU$ - разложения** - если все главные миноры матрицы $A$ отличны от нуля, то существуют единственная нижняя треугольная матрица $L$ и верхняя треугольная матрица $U$ такие, что:\n\n$$\nA = LU\n$$\n\n, где\n\n$$\nL = \n\\begin{bmatrix}\n1 \u0026 0 \u0026  0 \u0026 \\dots \u0026 0\\\\\n\\mu_{21} \u0026 1 \u0026 0 \u0026 \\dots \u0026 0\\\\\n\\mu_{31} \u0026 \\mu_{32} \u0026 1 \u0026 \\dots \u0026 0 \\\\\n\\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \\\\\n\\mu_{m1} \u0026 \\mu_{m2} \u0026 \\mu_{m3} \u0026 \\dots \u0026 1 \\\\\n\\end{bmatrix}\n$$\n\n**Описание метода:**\n \n![Метод LU - разложения](images/LU1.png)\n\n![Метод LU - разложения](images/LU2.png)\n\n![Метод LU - разложения](images/LU3.png)\n\n![Метод LU - разложения](images/LU4.png)\n\n```python\nfrom mathmod.linear_systems import lu_solve\n\nx = lu_solve(A, b)\n```\n\n---\n\n**Пример:**\n\nРассмотрим систмему:\n\n$$\nA = \n\\begin{bmatrix}\n2 \u0026 -1 \u0026 -2 \\\\\n-4 \u0026 6 \u0026 3 \\\\\n-4 \u0026 -2 \u0026 8\n\\end{bmatrix} \\quad\nb = \n\\begin{bmatrix}\n-5\\\\\n6\\\\\n8\n\\end{bmatrix}\n$$\n\nМы хотим представить её в виде произведения:\n\n$$\nA = LU\n$$\n\n, где:\n\n$$\nL = \n\\begin{bmatrix}\n1 \u0026 0 \u0026 0 \\\\\n\\mu_{21} \u0026 1 \u0026 0 \\\\\n\\mu_{31} \u0026 \\mu_{32} \u0026 1\n\\end{bmatrix}, \\quad\nU = \n\\begin{bmatrix}\nu_{11} \u0026 u_{12} \u0026 u_{13} \\\\\n0 \u0026 u_{22} \u0026 u_{23} \\\\\n0 \u0026 0 \u0026 u_{33}\n\\end{bmatrix}.\n$$\n\n**Шаг 1: Прямой ход (разложение)**\n\n1. Выбираем первый элемент матрицы $A$ как ведущий: \n   \n$$\nu_{11} = 2\n$$\n\n   Элементы верхней матрицы $U$:\n\n$$\nu_{12} = -1, \\quad u_{13} = -2.\n$$\n\n2. Вычисляем коэффициенты для матрицы $L$:\n   \n$$\n\\mu_{21} = \\frac{a_{21}}{u_{11}} = \\frac{-4}{2} = -2, \\quad\n\\mu_{31} = \\frac{a_{31}}{u_{11}} = \\frac{-4}{2} = -2.\n$$\n\n3. Обновляем элементы второй строки:\n   \n$$\nu_{22} = a_{22} - \\mu_{21} \\cdot u_{12} = 6 - (-2) \\cdot (-1) = 4,\n$$\n\n$$\nu_{23} = a_{23} - \\mu_{21} \\cdot u_{13} = 3 - (-2) \\cdot (-2) = -1.\n$$\n\n4. Обновляем элементы третьей строки:\n\n$$\nu_{32} = a_{32} - \\mu_{21} \\cdot u_{12} = -2 - (-2) \\cdot (-1) = -4\n$$\n\n$$\nu_{33} = a_{33} - \\mu_{21} \\cdot u_{13} = 8 - (-2) \\cdot (-2) = 4\n$$\n\n5. Промежуточные результаты:\n\n$$\nL = \n\\begin{bmatrix}\n1 \u0026 0 \u0026 0 \\\\\n-2 \u0026 1 \u0026 0 \\\\\n-2 \u0026 \\mu_{32} \u0026 1\n\\end{bmatrix}, \\quad\nU = \n\\begin{bmatrix}\n2 \u0026 -1 \u0026 -2 \\\\\n0 \u0026 4 \u0026 -1 \\\\\n0 \u0026 -4 \u0026 4\n\\end{bmatrix},\n$$\n\n6. Вычисляем $\\mu_{32}$:\n   \n$$\n\\mu_{32} = \\frac{u_{32}}{u_{22}} = -1\n$$\n\n7. Обновляем элементы третьей строки:\n\n$$\nu_{33} = u_{33} - \\mu_{32} \\cdot u_{23} = 4 - (-1) \\cdot (-1) = 3\n$$\n\n8. Итоговые матрицы\n\n$$\nL = \n\\begin{bmatrix}\n1 \u0026 0 \u0026 0 \\\\\n-2 \u0026 1 \u0026 0 \\\\\n-2 \u0026 -1 \u0026 1\n\\end{bmatrix}, \\quad\nU = \n\\begin{bmatrix}\n2 \u0026 -1 \u0026 -2 \\\\\n0 \u0026 4 \u0026 -1 \\\\\n0 \u0026 0 \u0026 3\n\\end{bmatrix}.\n$$\n\n**Шаг 2: решение системы**\n\nДля решения системы $Ax = b$, где:\n\n$$\nA = LU,\n$$\n\nРешение состоит из 2-х шагов:\n\n1. Решаем $Ly = b$ для $y$ методом прямой подстановки.\n2. Решаем $Ux = y$ для $x$ методом обратной подстановки.\n\nРешение:\n\n1. Прямой ход для $y$:\n   \n$$\nLy = b\n$$\n\n$$\n\\begin{bmatrix}\n1 \u0026 0 \u0026 0 \\\\\n-2 \u0026 1 \u0026 0 \\\\\n-2 \u0026 -1 \u0026 1\n\\end{bmatrix} \\cdot \n\\begin{bmatrix}\ny_1\\\\\ny_2\\\\\ny_3\n\\end{bmatrix} =\n\\begin{bmatrix}\n-5\\\\\n6\\\\\n8\n\\end{bmatrix}\n$$\n\n- Рассчитывем $y$:\n\n$$\n\\begin{aligned}\ny_1 \u0026= -5, \\\\\n-2 \\cdot y_1 + y_2 \u0026= 6, \\\\\n-2 \\cdot y_1 - 1 \\cdot y_2 + y_3 \u0026= 8.\n\\end{aligned}\n$$\n\n- Решая, получаем:\n\n$$\ny_1 = -5, \\\\\ny_2 = -4, \\\\\ny_3 = -6 \\\\\n$$\n\n2. Обратный ход для $x$:\n   \n$$\nUx = y\n$$\n\n$$\n\\begin{bmatrix}\n2 \u0026 -1 \u0026 -2 \\\\\n0 \u0026 4 \u0026 -1 \\\\\n0 \u0026 0 \u0026 3\n\\end{bmatrix} \\cdot \n\\begin{bmatrix}\nx_1\\\\\nx_2\\\\\nx_3\n\\end{bmatrix} =\n\\begin{bmatrix}\n-5\\\\\n-4\\\\\n-6\n\\end{bmatrix}\n$$\n\n- Рассчитывем $x$:\n\n$$\n\\begin{aligned}\n2 \\cdot x_1 - x_2 - 2 \\cdot x_3 \u0026= -5, \\\\\n4 \\cdot x_2 - x_3 \u0026= -4, \\\\\n3 \\cdot x_3 \u0026= -6.\n\\end{aligned}\n$$\n\n- Решая, получаем:\n\n$$\nx_1 = -5.25, \\quad\nx_2 = -1.5, \\quad\nx_3 = -2\n$$\n\n---\n\n#### 5. Метод прогонки\n- **Функция:** `three_diag(A,b)`\n\n**Трудоемкость метода** - $8m$\n\n**Условие применимости** - коэффициенты системы удовлетворяют условиям диагонального преобладания:\n\n$$\n|b_k| \\geq |a_k| + |c_k| \\quad\n|b_k| \u003e |a_k|\n$$\n\nТогда:\n\n$$\n\\gamma_i = b_i + a_i \\alpha_{i-1} \\neq 0 \\quad\n|\\alpha_i| \\leq 1 \\quad \\forall i = 1, 2, \\dots m\n$$\n\n**Описание метода:**\n\n$A$ - терхдиагональная матрица:\n\n$$\nA = \n\\begin{bmatrix}\nb_1 \u0026 c_1 \u0026  0 \u0026 \\dots \u0026 \\dots \u0026 0\\\\\na_2 \u0026 b_2 \u0026 c_2 \u0026 \\dots \u0026 \\dots \u0026 0\\\\\n0 \u0026 a_3 \u0026 b_3 \u0026 c_3 \u0026 \\dots \u0026 0 \\\\\n\\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \u0026 \\dots \\\\\n\\dots \u0026 \\dots \u0026 \\dots \u0026 a_{m-1} \u0026 b_{m-1} \u0026 c_{m-1} \\\\\n0 \u0026 0 \u0026 0 \u0026 \\dots \u0026 a_m \u0026 b_m \\\\\n\\end{bmatrix} \\quad \nb = \n\\begin{bmatrix}\nd_1\\\\\nd_2\\\\\nd_3\\\\\n\\vdots \\\\\nb_{m-1} \\\\\nb_m\n\\end{bmatrix}\n$$\n\n- **Прямой ход (прямая прогонка)** - вычисление прогоночных коэффициентов  \n \n$$\n\\alpha_i = -\\frac{c_i}{\\gamma_i} \\quad\n\\beta_i = \\frac{d_i - \\alpha_i \\beta_{i - 1}}{\\gamma_i} \\quad\n\\gamma_i = b_i + a_i \\alpha_{i - 1}\n$$\n\n- **Обратная прогонка (обратная прогонка)** - вычисление значения незвестных. Сначала $x_m = \\beta_m$. Затем значения осталных неизветных по формуле:\n\n$$\nx_i = \\alpha_i x_{i + 1} + \\beta_i \\quad\ni = m - 1, m - 2, \\dots, 1\n$$ \n\n```python\nfrom mathmod.linear_systems import three_diag\n\nx = three_diag(A,b)\n```\n\n---\n\n**Пример:**\n\nРассмотрим систмему:\n\n$$\nA = \n\\begin{bmatrix}\n5 \u0026 -1 \u0026 0 \u0026 0 \\\\\n2 \u0026 4.6 \u0026 -1 \u0026 0 \\\\\n0 \u0026 2 \u0026 3.6 \u0026 -0.8 \\\\\n0 \u0026 0 \u0026 3 \u0026 4.4\n\\end{bmatrix} \\quad\nb = \n\\begin{bmatrix}\n2\\\\\n3.3\\\\\n2.6\\\\\n7.2\n\\end{bmatrix}\n$$\n\n**Прямой ход**\n\n$$\n\\gamma_1 = b_1 = 5, \\quad \\alpha_1 = -c_1 / \\gamma_1 = 0.2, \\quad \\beta_1 = d_1 / \\gamma_1 = 2.0 / 5 = 0.4,\n$$\n\n$$\n\\gamma_2 = b_2 + a_2 \\alpha_1 = 4.6 + 2.0 \\cdot 0.2 = 5, \\quad \\alpha_2 = -c_2 / \\gamma_2 = 1 / 5 = 0.2,\n$$\n\n$$\n\\beta_2 = (d_2 - a_2 \\beta_1) / \\gamma_2 = (3.3 - 2.0 \\cdot 0.4) / 5 = 0.5,\n$$\n\n$$\n\\gamma_3 = b_3 + a_3 \\alpha_2 = 3.6 + 2.0 \\cdot 0.2 = 4, \\quad \\alpha_3 = -c_3 / \\gamma_3 = 0.8 / 4 = 0.2,\n$$\n\n$$\n\\beta_3 = (d_3 - a_3 \\beta_2) / \\gamma_3 = (2.6 - 2.0 \\cdot 0.5) / 4 = 0.4,\n$$\n\n$$\n\\gamma_4 = b_4 + a_4 \\alpha_3 = 4.4 + 3.0 \\cdot 0.2 = 5, \\quad \\beta_4 = (d_4 - a_4 \\beta_3) / \\gamma_4 = (7.2 - 3.0 \\cdot 0.4) / 5 = 1.2.\n$$\n\n**Обратный ход**\n\n$$\nx_4 = \\beta_4 = 1.2,\n$$\n\n$$\nx_3 = \\alpha_3 z_4 + \\beta_3 = 0.2 \\cdot 1.2 + 0.4 = 0.64,\n$$\n\n$$\nx_2 = \\alpha_2 z_3 + \\beta_2 = 0.2 \\cdot 0.64 + 0.5 = 0.628,\n$$\n\n$$\nx_1 = \\alpha_1 z_2 + \\beta_1 = 0.2 \\cdot 0.628 + 0.4 = 0.5256.\n$$\n\nИтак, получаем решение:\n\n$$\nx_1 = 0.5256, \\quad x_2 = 0.628, \\quad x_3 = 0.64, \\quad x_4 = 1.2.\n$$\n\n---\n\n### Итерационные методы \n\n**Итерационный метод** - метод, который строит последовательность приближений к решению;\n\n#### 1. Метод Якоби\n- **Функция:** `jacobi(A, b, epsilon=1e-6, norma=1)`\n\n  - `A` - Матрица коэффициентов (n x n);\n  - `b` - Вектор правой части;\n  - `epsilon` - Заданная точность (по умолчанию $10^{-6}$);\n  - `norma` - Норма, по которой считается критерий окончания (например, 1, 2, np.inf). \n\n**Теорема о сходимости:**\n\nПусть выполнено условие:\n\n$$\n||B|| \u003c 1\n$$\n\nТогда решение системы $\\overline{x}$ существует и единственно при произволном приближении $x^{(0)}$ МПИ сходится и справедлива оценка погрешности (*априорная оценка*):\n\n$$\n||x^{(n)} - \\overline{x}|| \\leq ||B||^{n}||x^{(0)} - \\overline{x}||\n$$\n\n**Апостериорная оценка:**\n\n$$\n||x^{(n)} - \\overline{x}|| \\leq \\frac{||B||}{1 - ||B||} ||x^{(n)}- x^{(n - 1)}||\n$$\n\n**Критерий окончания:**\n\n$$\n||x^{(n)}- x^{(n - 1)}|| \\leq \\epsilon_1\n$$\n\n, где:\n\n$$\n \\epsilon_1  = \\frac{||B||}{1 - ||B||} \\epsilon\n$$\n\nБолее простой критерий окончания:\n\n$$\n||x^{(n)}- x^{(n - 1)}|| \\leq \\epsilon\n$$\n\n**Описание метода:**\n\n![Метод простых итераций](images/jacobi.png)\n\n![Метод простых итераций](images/jacobi2.png)\n\n$$\n\\begin{aligned}\n    x_1^{k+1} = b_{11}x_1^{k} + b_{12}x_2^{k} + b_{13}x_3^{k} + \\dots + b_{1m}x_m^{k} + c_{1}, \\\\\n    x_2^{k+1} = b_{21}x_1^{k} + b_{22}x_2^{k} + b_{23}x_3^{k} + \\dots + b_{2m}x_m^{k} + c_{2}, \\\\\n    x_3^{k+1} = b_{31}x_1^{k} + b_{32}x_2^{k} + b_{33}x_3^{k} + \\dots + b_{3m}x_m^{k} + c_{3}, \\\\\n    \\dots \\\\\n    x_m^{k+1} = b_{m1}x_1^{k} + b_{m2}x_2^{k} + b_{m3}x_3^{k} + \\dots + b_{mm}x_m^{k} + c_{m}, \\\\\n\\end{aligned}\n$$\n\n```python\nfrom mathmod.linear_systems import jacobi\n\nx, iteration_count = jacobi(A, b, epsilon=1e-6, norma=1)\n```\n\n---\n\n**Пример:**\n\n![Метод простых итераций](images/jacobi3.png)\n\n---\n\n#### 2. Метод Гаусса-Зейделя\n- Итерационный метод для решения СЛАУ с диагонально преобладающей матрицей.\n- **Функция:** `gauss_zeydel(A, b, epsilon=1e-6, norma=1)`\n  \n  - `A` - Матрица коэффициентов (n x n);\n  - `b` - Вектор правой части;\n  - `epsilon` - Заданная точность (по умолчанию $10^{-6}$);\n  - `norma` - Норма, по которой считается критерий окончания (например, 1, 2, np.inf). \n\n![Метод Зейделя](images/image.png)\n\n#### 3. Метод релаксации\n- **Функция:** `relaxation_method(A, b, epsilon=1e-6, omega=1, norma=1)`\n\n  - `A` - Матрица коэффициентов (n x n); \n  - `b` - Вектор правой части; \n  - `epsilon` - Заданная точность (по умолчанию $10^{-6}$); \n  - `omega` - Параметр релаксации (по умолчанию 1.0 — метод Зейделя); \n  - `norma` - Норма, по которой считается критерий окончания (например, 1, 2, np.inf). \n\n![Метод релаксации](images/relax1.png)\n![Метод релаксации](images/relax2.png)\n\n\n```python\nfrom mathmod.linear_systems import relaxation_method\n\nx, iteration_count = relaxation_method(A, b, epsilon=1e-6, omega=1, norma=1)\n```\n\n---\n\n### Приближение функций\n\n#### Постановка задачи\n\n Известны значения некоторой функции $f(x)$ только на множестве дискретных точек $x_0, x_1, \\ldots, x_n$, но само аналитическое выражение для функции неизвестно. Заменим функцию $f(x)$ некоторой известной и достаточно легко вычисляемой функцией $\\Phi(x)$ такой, что $\\Phi(x) \\approx f(x)$. Подобный процесс замены неизвестной функции некоторой близкой функцией называется **аппроксимацией**, а функция $\\Phi(x)$ называется **аппроксимирующей функцией**.\n\nДля аппроксимации функций широко используются классы функций вида:\n\n$$\\Phi_m(x) = a_0\\phi_0(x) + a_1\\phi_1(x) + \\ldots + a_m\\phi_m(x),$$\n\nявляющиеся линейными комбинациями фиксированного набора базисных функций $\\phi_0(x), \\phi_1(x), \\ldots, \\phi_m(x)$. \n\n \nФункцию $\\phi_m(x)$ называют **обобщенным многочленом** по системе функций $\\phi_0(x), \\phi_1(x), \\ldots, \\phi_m(x)$\n\nЧисло $m$ - **степенью многочлена**.\n\nСуществуют два основных подхода в аппроксимации функций:\n\n1. Пусть точки $f(x_i), i = 0,1,\\ldots,n$ получены в результате достаточно точных измерений или вычислений, т.е. есть основания считать их лишенными ошибок. Тогда следует выбирать аппроксимирующую функцию $\\phi(x)$ такой, чтобы она совпадала со значениями исходной функции в заданных точках. Геометрически это означает, что кривая $\\phi(x)$ проходит через точки $(x_i, f(x_i))$ плоскости. Такой метод приближения называется **интерполяцией**.\n\n2. Если точки $f(x_i), i = 0,1,\\ldots,n$ содержат ошибки (данные экспериментов, статистические данные и т.п.), то функция $\\phi(x)$ выбирается из условия минимума некоторого функционала, обеспечивающего сглаживание ошибок. Такой прием называется **аппроксимацией** функции «в среднем». Геометрически это будет означать, что кривая $\\phi(x)$ будет занимать некоторое «среднее» положение, не обязательно совпадая с исходными точками $(x_i, f(x_i))$ плоскости.\n\n#### Постановка задачи интерполяции\n\nПусть в точках $x_0, x_1, \\ldots, x_n$, расположенных на отрезке $[a, b]$ и попарно различных. \n\nТогда задача итерполяции состоит в построении функции $g(x)$, удовлетворяющей условию:\n\n$$g(x) = y_i \\quad (i = 0, 1, \\ldots, n)$$\n\n**Интерполяция** - способ приближения функции $f(x)$ путем построения функии $g(x)$, график которой проходит через точки $(x_i, y_i)$. \n\n**Экстраполяция** - способ приближения функции $f(x)$ в точке $x \u003c x_{min}$ или $x \u003e x_{max}$.\n\n$[x_{min}, x_{max}]$ - минимальный и максимальный из узлов интерполяции.\n\n**Теорема о существовании и единственности интерполяционного многочлена:**\n\nЕсли $m = n$, то решение задачи интерполяции обобщенным многочленом ($\\Phi_m(x) = a_0\\phi_0(x) + a_1\\phi_1(x) + \\ldots + a_m\\phi_m(x)$) существует и единственно при любом наборе данных $y_0, y_1, \\ldots, y_n$, тогда и только тогда, когда системы функций $\\phi_0(x), \\phi_1(x), \\ldots, \\phi_n(x)$ являются линейно независимыми в точках $x_0, x_0, \\ldots, x_n$. \n\n\n#### Полиномиальная интерполяция. Многочлен Лагранжа\n\n$$\nL_n(x) = \\sum_{i = 0}^{n} y_i l_{nj}(x)\n$$\n\n, где:\n\n$$\nl_{ij}(x) = \\prod_{k = 1 \\atop k \\neq j}^{n}\\frac{(x - x_k)}{(x_j - x_i)} = \\frac{(x - x_0)(x - x_1) \\dots (x - x_{j-1})(x - x_{j+1}) \\dots (x - x_{n})}{(x_j - x_0)(x_j - x_1) \\dots (x_j - x_{j-1})(x_j - x_{j+1}) \\dots (x_j - x_{n})}\n$$\n\n**Оценка погрешности:**\n\n$$\n\\max_{[a, b]}|f(x) -  P_n(x)| \\leq \\frac{M_{n + 1}}{(n + 1)!}\\max_{[a, b]}|\\omega_{n + 1}(x)|\n$$\n\n$\\omega_{n + 1}(x) = (x - x_0)(x - x_1) \\dots (x - x_{n})$\n\n$M_{n + 1} = \\max_{[a, b]}|f^{n + 1}(x)|$\n\nили\n\n$$\n\\max_{[x_0, x_n]}|f(x) -  P_n(x)| \\leq \\frac{M_{n + 1}}{4(n + 1)}h^{n + 1}_{max}\n$$\n\n$h_{max} = \\max\\limits_{1 \\leq i \\leq n} h_{i}$\n\nЭта формула позволяет утвержать, что для достаточно гладкой функции $f$ при фиксированной степени интерполяционного многочлена погрешность интерполяции на отрезке $[x_0, x_n]$ при $h_{max} \\to 0$ стрепится к нулю не медленее, чем некоторая величина, пропорциональная $h^{n + 1}_{max}$.\n\nИтерполяция многочленом $n$ имеет $(n + 1)$-й порядок точности относительно $h_{max}$.\n\n---\n\n**Пример:**\n\nПусть даны точки:\n- $x_0 = 0$, $y_0 = 1$\n- $x_1 = 1$, $y_1 = 2$\n- $x_2 = 2$, $y_2 = 4$\n\nПостроим интерполяционный многочлен Лагранжа:\n\n$$L_2(x) = y_0 \\cdot \\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)} + y_1 \\cdot \\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)} + y_2 \\cdot \\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}$$\n\nПодставляя значения:\n\n$$L_2(x) = 1 \\cdot \\frac{(x-1)(x-2)}{(0-1)(0-2)} + 2 \\cdot \\frac{(x-0)(x-2)}{(1-0)(1-2)} + 4 \\cdot \\frac{(x-0)(x-1)}{(2-0)(2-1)}$$\n\n$$L_2(x) = 1 \\cdot \\frac{(x-1)(x-2)}{2} - 2 \\cdot \\frac{x(x-2)}{1} + 2 \\cdot \\frac{x(x-1)}{2}$$\n\n---\n\n#### Интерполяционный многочлен Ньютона с конечными разностями\n\nПусть интерполируемая функция задана таблицей с постоянными шагом $h$, т.е. $x_i = x_0 + ih, i = 0,1 \\ldots n$. Тогда введя безразмерную величину $t = \\frac{x - x_0}{h}$, можно записать многочлен Ньютона:\n\n$$\nP_{n}(x) = P_{n}(x + ht) = y_0 + \\frac{\\Delta y_0}{1!}t + \\frac{\\Delta^2 y_0}{2!}t(t - 1) + \\frac{\\Delta^3 y_0}{3!}t(t - 1)(t - 2) + \\ldots + \\frac{\\Delta^n y_0}{n!}t(t - 1)(t - 2) \\ldots (t - n + 1)\n$$\n\n---\n\n#### Метод наименьших квадратов\n\n**Постановка задачи**\n\nПусть даны точки $x_0, x_1, \\ldots, x_n$, и известны значения исходной фукнции $f_i = f(x_i), i = 0, 1, \\ldots n$. Требуется найти многочлен $P_m$ заданной степени $m (m = n)$ такой, чтобы величина среднеквадратического отклонения:\n\n$$\n\\sigma(P_m, f) = \\sqrt{\\frac{1}{1 + n}\\sum_{i = 0}^n(P_m(x_i) - f_i)^2} = \\sqrt{\\frac{1}{1 + n}\\sum_{i = 0}^n(\\sum_{j = 0}^n a_j x_i^j - f_i)^2}\n$$\n\nбыла минимальной\n\n**Нормальная система:**\n\n$$\n\\sum_{j = 0}^m a_j \\sum_{i = 0}^n x_i^{k + j} = \\sum_{i = 0}^n f_i x_i^k \\quad k = 0, 1, \\ldots m \n$$\n\n$$\ns_k = \\sum_{i = 0}^n x_i^k \\quad b_k = \\sum_{i = 0}^n f_i x_i^k\n$$\n\n$$\n\\begin{aligned}\n    (n + 1)a_{0} + (\\sum_{i = 0}^n x_i)a_{1} + (\\sum_{i = 0}^n x_i^2)a_{2}  = \\sum_{i = 0}^n y_i, \\\\\n    (\\sum_{i = 0}^n x_i)a_{0} + (\\sum_{i = 0}^n x_i^2)a_{1} + (\\sum_{i = 0}^n x_i^3)a_{2} = \\sum_{i = 0}^n y_i x_i, \\\\\n    (\\sum_{i = 0}^n x_i^2)a_{0} + (\\sum_{i = 0}^n x_i^3)a_{1} + (\\sum_{i = 0}^n x_i^4)a_{2} = \\sum_{i = 0}^n y_i x_i^2, \\\\\n\\end{aligned}\n$$\n\n---\n\n## Установка\nДля использования библиотеки склонируйте репозиторий и установите необходимые зависимости:\n```bash\ngit clone https://github.com/BaranovSerV/mathmod.git\ncd mathmod\npip install -r requirements.txt\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaranovserv%2Fmathmod","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaranovserv%2Fmathmod","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaranovserv%2Fmathmod/lists"}