Merge pull request 'Добавление информации о методах (№1)' (#2) from dev into master

Reviewed-on: #2
This commit is contained in:
Григорий Ступников 2023-10-27 08:28:22 +00:00
commit 3c44ed2bac
22 changed files with 2468 additions and 35 deletions

View File

@ -14,6 +14,51 @@
\addcontentsline{toc}{chapter}{Приложения}
\appendix
% \section{Скрипты установки БД для компонента <<Хранение~данных>>}
% \label{script:storage}
% \inputcode{../software/architecture/first-level/component-storage/CSt.db-script.sql}{frame=none,language=sql}
\section{Результаты вывода программы}
\label{output_program}
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{assets/Thomas}
\caption{Вывод программы для решения СЛУ методом прогонки}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{assets/Inverted}
\caption{Вывод программы для решения СЛУ методом обратной матрицы}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{assets/lagrange}
\caption{График интерполяции функции методом Лагранжа}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{assets/newton}
\caption{График интерполяции функции методом Ньютона}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{assets/CubicSpline}
\caption{График сплайн-интерполяции функции с помощью \textbf{CubicSpline}}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{assets/PchipInterpolator}
\caption{График сплайн-интерполяции функции с помощью \textbf{PchipInterpolator}}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{assets/CubicHermiteSpline}
\caption{График сплайн-интерполяции функции с помощью \textbf{CubicHermiteSpline}}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{assets/Akima1DInterpolator}
\caption{График сплайн-интерполяции функции с помощью \textbf{Akima1DInterpolator}}
\end{figure}
\section{Листинг программы}
\label{program_code}
\inputcode{code/main.py}{frame=none,language=python}

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
assets/CubicSpline.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
assets/Gauss.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
assets/Inverted.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
assets/Thomas.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
assets/bisect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
assets/curve_fit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
assets/lagrange.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
assets/least_squares.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
assets/newton.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
assets/python-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

429
code/main.py Normal file
View File

@ -0,0 +1,429 @@
import scipy.integrate as sitg
import scipy.interpolate as sitp
import scipy.optimize as sopt
import scipy.linalg as salg
import math as m
import numpy as np
import matplotlib.pyplot as plt
def create_subplot():
return plt.subplots(layout='constrained')[1]
def plt_append(sp, x: list[float], y: list[float], label: str, format: str):
sp.plot(x, y, format, label=label)
def generate_array(min, max, density=10):
point_count = int(m.fabs(max-min)*density)
x = np.linspace(min, max, point_count)
return list(x.tolist())
class NonLinear:
bisect_exp = "x**2 * np.sin(x)"
newton_exp = "np.sin(x) * np.sqrt(np.abs(x))"
@staticmethod
def slice_array(range: list[float], val_min, val_max):
def index_search(range: list[float], val):
i = 0
for v in range:
if v >= val:
return i
i += 1
return -1
index_l = index_search(
range, val_min) if val_min is not None else range.index(min(range))
index_r = index_search(
range, val_max) if val_max is not None else range.index(max(range))
return range[index_l:index_r+1]
@staticmethod
def bisect(x, x_min, x_max):
def f(x): return eval(NonLinear.bisect_exp)
y = f(np.array(x))
root = sopt.bisect(f, x_min, x_max)
solution = root[0] if root is tuple else root
return list(y), (float(solution), float(f(solution)))
@staticmethod
def plot_bisect():
bounds = 0, 6
split_val = 1
x1 = generate_array(bounds[0], bounds[1])
x2 = NonLinear.slice_array(x1, split_val, None)
sp = create_subplot()
sol1 = NonLinear.bisect(x1, bounds[0], bounds[1])
sol2 = NonLinear.bisect(x2, split_val, bounds[1])
plt_append(
sp, x1, sol1[0], f"Исходные данные (y={NonLinear.bisect_exp})", "-b")
plt_append(
sp, *(sol1[1]), f"bisect на [{bounds[0]},{bounds[1]}]", "or")
plt_append(
sp, *(sol2[1]), f"bisect на [{split_val},{bounds[1]}]", "og")
sp.set_title("scipy.optimize.bisect")
sp.legend(loc='lower left')
@staticmethod
def newton(x, x0):
def f(x): return eval(NonLinear.bisect_exp)
y = f(np.array(x))
root = sopt.newton(f, x0)
solution = root[0] if root is tuple else root
return list(y), (float(solution), float(f(solution)))
@staticmethod
def plot_newton():
bounds = -2, 7
split_l, split_r = 2, 5
x1 = generate_array(bounds[0], bounds[1])
x2 = NonLinear.slice_array(x1, split_l, split_r)
x0_1, x0_2 = 1/100, 4
sp = create_subplot()
sol1 = NonLinear.newton(x1, x0_1)
sol2 = NonLinear.newton(x2, x0_2)
plt_append(
sp, x1, sol1[0], f"Исходные данные (y={NonLinear.newton_exp})", "-b")
plt_append(
sp, *(sol1[1]), f"newton на отрезке [{bounds[0]},{bounds[1]}]", "or")
plt_append(
sp, *(sol2[1]), f"newton на отрезке [{split_l},{bounds[1]}]", "og")
sp.set_title("scipy.optimize.newton")
sp.legend(loc='lower left')
@staticmethod
def plot(method: str = "all"):
if method in ["bisect", "all"]:
NonLinear.plot_bisect()
if method in ["newton", "all"]:
NonLinear.plot_newton()
plt.ylabel("y")
plt.xlabel("x")
plt.show()
class SLE:
gauss_data = ([[13, 2], [3, 4]], [1, 2])
invmatrix_data = ([[13, 2], [3, 4]], [1, 2])
tridiagonal_data = ([[4, 5, 6, 7, 8, 9],
[2, 2, 2, 2, 2, 0]],
[1, 2, 2, 3, 3, 3])
@staticmethod
def var_str(index):
return f"x{index+1}"
@staticmethod
def print_solution(data: list[float]):
print(" ", end='')
for i, val in enumerate(data[:-1]):
print(f"{SLE.var_str(i)} = {round(val,3)}, ", end='')
print(f"{SLE.var_str(len(data)-1)} = {round(data[-1],3)}")
@staticmethod
def print_data(data: tuple[list[list[float]], list[float]], tridiagonal: bool = False):
if tridiagonal:
new_data = []
new_len = len(data[0][0])
zipped = list(zip(*tuple(data[0])))
zipped[len(zipped)-1] = (zipped[len(zipped)-1]
[0], zipped[len(zipped)-2][1])
complement_to = new_len - len(zipped[0])
for i, val in enumerate(zipped):
zero_r = complement_to - i
if zero_r <= 0:
zero_r = 0
mid_val = list(reversed(val[1:])) + list(val)
mid_end = len(mid_val) if zero_r > 0 else len(
mid_val) + (complement_to - i)
mid_beg = len(mid_val) - (new_len - zero_r) if zero_r > 0 else 0
mid_beg = mid_beg if mid_beg >= 0 else 0
zero_l = new_len - (zero_r + (mid_end - mid_beg))
tmp = [0] * zero_l + \
mid_val[mid_beg:mid_end] + [0] * zero_r
new_data.append(tmp)
data = (new_data, data[1])
for i, val in enumerate(data[0]):
print(" ", end='')
for i_coef, coef in enumerate(val[:-1]):
if coef != 0:
print(f"({coef}{SLE.var_str(i_coef)}) + ", end='')
else:
print(f" {coef} + ", end='')
print(f"({val[-1]}{SLE.var_str(len(val)-1)})", end='')
print(f" = {data[1][i]}")
@staticmethod
def gauss(system: list[list[float]], b: list[float]):
lup = salg.lu_factor(system)
solution = salg.lu_solve(lup, b)
return solution
@staticmethod
def invmatrix(system: list[list[float]], b: list[float]):
m_inv = salg.inv(system)
solution = m_inv @ b
return solution
@staticmethod
def tridiagonal(system: list[list[float]], b: list[float]):
solution = salg.solveh_banded(system, b, lower=True)
return solution
@staticmethod
def print_gauss():
print("Gauss method (LU decomposition)")
print(" Input system:")
SLE.print_data(SLE.gauss_data)
print(" Solution:")
SLE.print_solution(SLE.gauss(*SLE.gauss_data))
@staticmethod
def print_invmatrix():
print("Inverted matrix method")
print(" Input system:")
SLE.print_data(SLE.invmatrix_data)
print(" Solution:")
SLE.print_solution(SLE.invmatrix(*SLE.invmatrix_data))
@staticmethod
def print_tridiagonal():
print("Tridiagonal matrix method (Thomas algorithm)")
print(" Input system:")
SLE.print_data(SLE.tridiagonal_data, True)
print(" Solution:")
SLE.print_solution(SLE.tridiagonal(*SLE.tridiagonal_data))
@staticmethod
def print(method="all"):
if method in ["gauss", "all"]:
SLE.print_gauss()
if method in ["invmatrix", "all"]:
SLE.print_invmatrix()
if method in ["banded", "all"]:
SLE.print_tridiagonal()
class Approx:
function_exp = "np.sin(x) * np.sqrt(np.abs(x))"
least_sq_exp = "np.sin(x) * np.abs(x)"
@staticmethod
def get_function_exp_der(*args):
function_der_exp = "(x * np.sin(x) + 2 * x**2 * np.cos(x)) / (2 * np.sqrt(np.abs(x)) ** 3)"
result = ()
for i in args:
array = []
for x in i:
array.append(eval(function_der_exp))
result = result + (array,)
return result
@staticmethod
def generate_y(x_array, function):
result = []
for x in x_array:
result.append(eval(function))
return result
@staticmethod
def lagrange(x, y):
return sitp.lagrange(x, y)
@staticmethod
def get_approx_data(function=function_exp, bounds=[-6, 6]):
x1 = generate_array(bounds[0], bounds[1], 1/2)
x2 = generate_array(bounds[0], bounds[1], 1)
y1 = Approx.generate_y(x1, function)
y2 = Approx.generate_y(x2, function)
x_real = generate_array(bounds[0], bounds[1])
y_real = Approx.generate_y(x_real, function)
return x1, x2, y1, y2, x_real, y_real
@staticmethod
def plot_lagrange():
x1, x2, y1, y2, x_real, y_real = Approx.get_approx_data()
sp = create_subplot()
sol1 = np.polynomial.polynomial.Polynomial(
Approx.lagrange(x1, y1).coef[::-1])
sol2 = np.polynomial.polynomial.Polynomial(
Approx.lagrange(x2, y2).coef[::-1])
plt_append(
sp, x_real, y_real, f"Исходные данные (y={Approx.function_exp})", "--b")
plt_append(
sp, x_real, sol1(np.array(x_real)), f"f1 = lagrange, кол-во точек = {len(x1)}", "-m")
plt_append(
sp, x_real, sol2(np.array(x_real)), f"f2 = lagrange, кол-во точек = {len(x2)}", "-r")
plt_append(
sp, x1, y1, f"Исходные точки для f1", ".m")
plt_append(
sp, x2, y2, f"Исходные точки для f2", ".r")
sp.set_title("scipy.interpolate.lagrange")
sp.legend(loc='lower left')
@staticmethod
def plot_spline():
x1, x2, y1, y2, x_real, y_real = Approx.get_approx_data()
d1, d2 = Approx.get_function_exp_der(x1, x2)
for interpolator in [sitp.CubicSpline,
sitp.PchipInterpolator,
sitp.CubicHermiteSpline,
sitp.Akima1DInterpolator]:
sp = create_subplot()
if interpolator.__name__ != "CubicHermiteSpline":
args1 = x1, y1
args2 = x2, y2
else:
args1 = x1, y1, d1
args2 = x2, y2, d2
sol1 = interpolator(*args1)
sol2 = interpolator(*args2)
plt_append(
sp, x_real, y_real, f"Исходные данные (y={Approx.function_exp})", "--b")
plt_append(
sp, x_real, sol1(np.array(x_real)), f"f1 = {interpolator.__name__}, кол-во точек = {len(x1)}", "-m")
plt_append(
sp, x_real, sol2(np.array(x_real)), f"f2 = {interpolator.__name__}, кол-во точек = {len(x2)}", "-r")
plt_append(
sp, x1, y1, f"Исходные точки для f1", ".m")
plt_append(
sp, x2, y2, f"Исходные точки для f2", ".r")
sp.set_title(f"scipy.interpolate.{interpolator.__name__}")
sp.legend(loc='lower left')
@staticmethod
def linear(x, a, b):
return a*x + b
@staticmethod
def quadratic(x, a, b, c):
return a * (x**2) + (b*x) + c
@staticmethod
def fract(x, a, b, c):
return x / (a * x + b) - c
@staticmethod
def noise_y(y, rng):
diff = max(y) - min(y)
noise_coeff = diff*(10/100)
return y + (noise_coeff * rng.normal(size=len(y)))
@staticmethod
def plot_least_squares_curvefit():
rng = np.random.default_rng()
bounds = [3, 6]
x1, x2, y1, y2, x_real, y_real = Approx.get_approx_data(
Approx.least_sq_exp, bounds)
x_real = np.array(x_real)
y_real = Approx.noise_y(y_real, rng)
base_functions = [Approx.linear,
Approx.quadratic, (Approx.fract, "x/(ax+b)")]
sp = create_subplot()
plt_append(
sp, x_real, y_real, f"y={Approx.least_sq_exp} на [{bounds[0]};{bounds[1]}], с шумом", ".b")
for bf in base_functions:
if isinstance(bf, tuple):
bf, desc = bf[0], bf[1]
else:
bf, desc = bf, None
optimal_params, _ = sopt.curve_fit(bf, x_real, y_real)
desc_str = f" ({desc}) " if desc is not None else ""
plt_append(
sp, x_real, bf(np.array(x_real), *optimal_params),
f"МНК, вид функции - {bf.__name__}{desc_str}", "-")
sp.set_title(f"scipy.optimize.curve_fit")
sp.legend(loc='lower left')
@staticmethod
def plot_least_squares():
rng = np.random.default_rng()
def exponential(x, a, b, c):
return np.sin(x) * np.sqrt(np.abs(x))
exponential.str = "np.sin(x) * np.sqrt(np.abs(x))"
def gen_y(x, a, b, c, noise=0., n_outliers=0):
y = exponential(x, a, b, c)
error = noise * rng.standard_normal(x.size)
outliers = rng.integers(0, x.size, n_outliers)
error[outliers] *= 10
return y + error
def loss(params, x, y):
return (exponential(x, params[0], params[1], params[2])) - y
params0 = np.array([0.1, 1, 0])
bounds = [-5, 3]
params_real = (3, 1, 5)
x_approx = np.array(generate_array(bounds[0], bounds[1], 4))
y_approx = np.array(gen_y(x_approx, *params_real,
noise=0.3, n_outliers=4))
params_lsq = sopt.least_squares(
loss, params0, loss='linear', args=(x_approx, y_approx)).x
params_soft_l1 = sopt.least_squares(
loss, params0, loss='soft_l1', args=(x_approx, y_approx),f_scale=0.1).x
params_cauchy = sopt.least_squares(
loss, params0, loss='cauchy', args=(x_approx, y_approx), f_scale=2).x
x_real = np.array(generate_array(bounds[0], bounds[1]))
y_real = np.array(gen_y(x_real, *params_real, 0, 0))
sp = create_subplot()
sp.plot(x_real, y_real, "-b",
label=f"y={exponential.str} на [{bounds[0]};{bounds[1]}]")
sp.plot(x_approx, y_approx, ".r", label=f"Табличные значения с шумом")
sp.plot(x_real, gen_y(x_real, *params_lsq), color="green",
label=f"loss=\"linear\"", linestyle=(0, (5, 10)))
sp.plot(x_real, gen_y(x_real, *params_soft_l1), color="magenta",
label=f"loss=\"soft_l1\"", linestyle=(5, (5, 10)))
sp.plot(x_real, gen_y(x_real, *params_cauchy), color="black",
label=f"loss=\"cauchy\"", linestyle=(7, (5, 10)))
sp.set_title(f"scipy.optimize.least_squares")
sp.legend(loc='lower left')
@staticmethod
def plot(method: str = "all"):
if method in ["lagrange", "all"]:
Approx.plot_lagrange()
if method in ["spline", "all"]:
Approx.plot_spline()
if method in ["least_squares_curvefit", "all"]:
Approx.plot_least_squares_curvefit()
if method in ["least_squares", "all"]:
Approx.plot_least_squares()
plt.ylabel("y")
plt.xlabel("x")
plt.show()
def main():
NonLinear.plot()
SLE.print()
Approx.plot()
if __name__ == "__main__":
main()

15
conclusion.tex Normal file
View File

@ -0,0 +1,15 @@
\chapter*{Заключение}
В ходе выполнения работы были выполнены поставленные задачи, цель
достигнута. В ходе исследования возможностей библиотек выяснилось,
что они не содержат реализаций численных методов для
решения систем нелинейных уравнений.
В целом, в ходе работы с библиотеками стоит отметить положительные
стороны: гибкость интерфейсов, высокое качество решений, большое
количество доступной информации о результатах работы алгоритма.
Из недостатков интерфейса библиотек можно отметить его неоднородность ---
некоторые численные методы реализованы с помощью классов, другие
с помощью функций, что может незначительно увеличить время на
освоение интерфейса библиотек и ее возможностей пользователями.

64
experimental_research.tex Normal file
View File

@ -0,0 +1,64 @@
\chapter{Экспериментальное исследование возможностей библиотек}
Для исследования возможностей библиотек была разработана программа
на языке Python. Она позволяет изучить работу наиболее популярных
численных методов: методов решения нелинейных уравнений и
СЛУ, а также аппроксимации функций.
Ее структура состоит из классов \textbf{NonLinear}, \textbf{SLE},
\textbf{Approx}. Они состоят только из статических методов,
пользовательских родительских классов не имеют.
При запуске программа сначала выводит графики решений нелинейных
уравнений в отдельных окнах (рисунок \ref{bisect}, рисунок\ref{newton}),
входные и выходные данные для методов решения СЛУ в терминале, и
затем результаты аппроксимации, так же в виде графиков в отдельных
окнах.
Результат работы метода Гаусса (вывод терминала) приведен на
рисунке \ref{gauss}.
Вывод графиков осуществляется с помощью библиотеки \textbf{matplotlib},
через функции \textbf{matplotlib.pyplot.plot} и \textbf{matplotlib.pyplot.subplots} \cite{links:matplotlib}.
Все графики имеют заголовок, в котором написано название функции,
легенду в нижнем левом углу, в которой описаны данные графика.
\begin{figure}[ht]
\centering
\includegraphics[width=0.6\textwidth]{assets/bisect.png}
\caption{Результат исследования функции bisect}
\label{bisect}
\end{figure}
\begin{figure}[ht]
\centering
\includegraphics[width=0.6\textwidth]{assets/newton.png}
\caption{Результат исследования функции newton}
\label{newton}
\end{figure}
\begin{figure}[ht]
\centering
\includegraphics[width=0.6\textwidth]{assets/Gauss.png}
\caption{Результат решения СЛУ методом Гаусса}
\label{gauss}
\end{figure}
Для получения результатов исследования отдельных классов численных
методов есть следующие методы:
\begin{enumerate}
\item \textbf{NonLinear.plot} для вывода графиков результатов
решения нелинейных уравнений, \textbf{Approx.plot} --- для вывода
графиков решения задачи аппроксимации.
\item \textbf{SLE.print} --- для вывода результатов решения
СЛУ в терминал
\end{enumerate}
Данные методы самостоятельно вызываются при запуске программы
пользователем.
Вывод терминала а также графики для остальных методов приведены
в приложении А.
Код программы приведен в приложении Б.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

1778
main.tex

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,4 @@
\documentclass{beamer}
\usepackage[russian]{babel}
\usepackage[utf8]{inputenc}
\usepackage[outputdir=cache]{minted}
@ -14,7 +12,7 @@
\title[]{\cwtitle}
\institute[]{ФГБОУ ВО «Вятский государственный университет»}
\date{\null}
\author[ ]{Студент ПМИб-3301-52-00 \cwauthor\\ \and к.п.н. А.Н.~Соколова}
\author[ ]{Студент ПМИб-3301-52-00 \cwauthor \newline \and к.п.н. А.Н.~Соколова}
\newcommand\frametitleSpec[1]{%
\frametitle{#1}
@ -27,43 +25,150 @@
\begin{document}
\begin{frame}
\centering\includegraphics[width=0.4\textwidth]{files/vyatsu_logo.png}\\
\centering\includegraphics[width=0.4\textwidth]{assets/vyatsu_logo.png}\\
\titlepage
\end{frame}
\begin{frame}
\frametitle{План доклада}
\tableofcontents
\end{frame}
\begin{frame}
\frametitleSpec{Введение}
Активное внедрение компьютеров во всевозможные отрасли жизни человека привело к тому, что при решении прикладных задач требование к скорости и дешевизне разработки стало выше требований производительности и ресурсоемкости разрабатываемой программы.
Для языка Python разработаны библиотеки numpy и scipy
математической направленности.
Они включают в себя множество алгоритмов решения разнообразных задач, в том числе для интегрирования функций, осуществления операций над массивами и
матрицами.
\begin{enumerate}
\item Проблема состоит в том, что на данный момент ОС, которая бы могла более эффективно использовать текущее АО устройств, не разработана.
\item Целью данной работы является рассмотрение архитектуры и разработка части прототипа данной ОС.
\item Проблема состоит в том, что на данный момент особенности
библиотек, полнота их возможностей с точки зрения решения
задач численными методами недостаточно исследованы.
\item \textbf{Целью} данной работы является исследование
вышеприведенных характеристик данных библиотек.
\item Для достижения цели курсового проекта необходимо выполнить
следующие \textbf{задачи}:
\begin{itemize}
\item Изучить архитектуру и требования прототипа ОС.
\item Определить перечень сервисов обеспечения целостности и оптимизации экосистемы устройств.
\item Разработать БД и сервисы обеспечения целостности и оптимизации прототипа экосистемы устройств.
\item Изучить распространенные численные методы решения
основных классов задач.
\item Изучить документацию библиотек numpy и scipy на
предмет реализации рассмотренных методов.
\item Экспериментально исследовать возможности
реализаций рассмотренных численных методов данных
библиотек.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitleSpec{О программной реализации}
Реализация сервисов написана на языке C++ в виде отдельных компонентов.
\frametitleSpec{Рассмотренные численные методы}
Всего было рассмотрено 20 численных методов, каждый из которых
решает свой класс задач:
\begin{enumerate}
\item Решение нелинейных уравнений
\begin{itemize}
\item Метод деления отрезка пополам
\item Метод касательных (Ньютона)
\item Метод простой итерации
\end{itemize}
\item Решение СЛУ:
\begin{itemize}
\item Метод Гаусса
\item Метод обратной матрицы
\item Метод прогонки
\item Метод простой итерации
\item Метод Зейделя
\end{itemize}
\item Решение систем нелинейных уравнений, с помощью метода Ньютона, и модифицированных версий методов Зейделя и простой итерации.
\end{enumerate}
\end{frame}
\begin{frame}
\begin{enumerate}
\item Аппроксимация функций
\begin{itemize}
\item Интерполяционные полиномы Лагранжа, Ньютона
\item Сплайн-интерполяция
\item Сглаживание. Метод наименьших квадратов
\end{itemize}
\item Численное интегрирование
\begin{itemize}
\item Метод трапеций
\item Метод парабол
\end{itemize}
\item Решение задачи Коши ОДУ
\begin{itemize}
\item Метод Эйлера, и его модифицированная версия
\item Метод Рунге-Кутта
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitleSpec{Экспериментальное исследование библиотек}
Была разработана программа на языке Python, использующая
возможности scipy и numpy для решения задач.
\begin{figure}[h]
\centering
\includegraphics[width=0.25\textwidth]{files/cpp-logo.png}
\includegraphics[width=0.25\textwidth]{assets/python-logo.png}
\end{figure}
В программе были приведены примеры решения СЛУ, нелинейных уравнений
и задач аппроксимации функций с помощью описанных в данной работе
методов. Программа не интерактивная.
\end{frame}
\begin{frame}
\frametitleSpec{Результаты работы программы}
\begin{figure}
\includegraphics[width=0.5\textwidth]{assets/bisect}
\end{figure}
\begin{figure}
\includegraphics[width=0.65\textwidth]{assets/Gauss}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}
\includegraphics[width=1\textwidth]{assets/Thomas.png}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}
\includegraphics[width=1\textwidth]{assets/lagrange.png}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}
\includegraphics[width=1\textwidth]{assets/CubicSpline}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}
\includegraphics[width=1\textwidth]{assets/Akima1DInterpolator.png}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}
\includegraphics[width=1\textwidth]{assets/curve_fit.png}
\end{figure}
\end{frame}
\begin{frame}
\frametitleSpec{Заключение}
При реализации прототипа экосистемы был разработан один из возможных вариантов деления на подсистемы, и рассмотрены возможные пути реализации.
Из недостатков текущей реализации можно отметить отсутствие компонента, отвечающего за безопасность и разделения прав доступа пользователей к вычислительным ресурсам сервера.
Таким образом, задачи проекта выполнены, цель проекта достигнута.
В ходе выполнения работы были выполнены поставленные задачи, цель
достигнута. В ходе исследования возможностей библиотек выяснилось,
что они не содержат реализаций численных методов для
решения систем нелинейных уравнений.
В целом, в ходе работы с библиотеками стоит отметить положительные
стороны: гибкость интерфейсов, высокое качество решений, большое
количество доступной информации о результатах работы алгоритма.
Из недостатков интерфейса библиотек можно отметить его
неоднородность --- некоторые численные методы реализованы с помощью
классов, другие с помощью функций, что может незначительно
увеличить время на освоение интерфейса библиотек и ее возможностей
пользователями.
\end{frame}
\begin{frame}
\begin{center}

View File

@ -1,23 +1,28 @@
\newcommand{\LiteratureAccessDate}[1][1]{%
дата~обращения: \ifcase#1\or 03.08.2023%
\or 07.08.2023%
\or 09.08.2023%
дата~обращения: \ifcase#1%
\or 03.08.2023% 1 (default)
\or 07.08.2023% 2
\or 09.08.2023% 3
\or 19.08.2023% 4
\or 17.10.2023% 5
\else\@ctrerr\fi
}
}
\renewcommand\bibname{Библиографический список}
\begin{thebibliography}{00}
\addcontentsline{toc}{chapter}{Библиографический список}
\bibitem{book:nm-examples} Ахмадиев Ф.Г., Габбасов Ф.Г., Ермолаева Л.Б., Маланичев И.В. Численные методы. Примеры и задачи. Учебно-методическое пособие по курсам «Информатика» и «Вычислительная математика». -- Казань:
КГАСУ, 2017. -- 107 с.
\bibitem{book:bahvalov} Бахвалов~Н.~С., Жидков~Н.~П.,
Кобельков~Г.~М. Численные методы. -- 7-е изд. -- М.: БИНОМ. Лаборатория знаний,
2011. -- 636 с., c илл. -- (Классический университетский учебник).
\bibitem{book:nm-examples} Ахмадиев Ф.Г., Габбасов Ф.Г., Ермолаева Л.Б., Маланичев И.В. Численные методы. Примеры и задачи. Учебно-методическое пособие по курсам «Информатика» и «Вычислительная математика». -- Казань: КГАСУ, 2017. -- 107 с.
\bibitem{book:bahvalov} Бахвалов~Н.~С., Жидков~Н.~П., Кобельков~Г.~М. Численные методы. -- 7-е изд. -- М.: БИНОМ. Лаборатория знаний, 2011. -- 636 с., c илл. -- (Классический университетский учебник).
\bibitem{links:matplotlib} Документация модуля pyplot библиотеки matplotlib [Электронный ресурс] -- URL:~\url{https://matplotlib.org/stable/api/pyplot_summary.html} (\LiteratureAccessDate[5]).
\bibitem{book:levitin} Левитин~A.~В. Алгоритмы: введение в разработку и анализ. -- Пер.~с~англ. -- М.:Издательский~дом~"Вильяме", 2006. -- 576 с., с ил.
\bibitem{book:lectures} Письменный~Д.~Т. Конспект лекций по высшей математике. 2 часть. -- М.: Рольф, 2000. -- 256 с., с илл.
\bibitem{article:fehlberg} Classical Fifth-, Sixth-, Seventh-, and Eighth-Order Runge-Kutta Formulas with Stepsize Control / Fehlberg E. // NASA technical report 287 -- 1968. -- P.~82
\bibitem{links:numpy} Numpy. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://numpy.org/} (\LiteratureAccessDate[2]).
\bibitem{links:numpy_doc} Numpy API Reference [Электронный ресурс] -- URL:~\url{https://numpy.org/doc/stable/reference/index.html} (\LiteratureAccessDate[3]).
\bibitem{links:PEP465} PEP 465 -- A dedicated infix operator for matrix multiplication [Электронный ресурс] -- URL:~\url{A dedicated infix operator for matrix multiplication} (\LiteratureAccessDate[4]).
\bibitem{links:bhatia} Positive definite matrices / R. Bhatia // Princeton Series in Applied Mathematics -- 2007.
\bibitem{links:python} Python. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://www.python.org/} (\LiteratureAccessDate).
\bibitem{links:scipy} Scipy. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://scipy.org/} (\LiteratureAccessDate[2]).
\bibitem{links:scipy_doc} Scipy API Reference [Электронный ресурс] -- URL:~\url{https://docs.scipy.org/doc/scipy/reference/index.html} (\LiteratureAccessDate[3]).
\bibitem{links:tiobe_index} TIOBE. Официальный сайт проекта
[Электронный ресурс] -- URL:~\url{https://www.tiobe.com/tiobe-index/} (\LiteratureAccessDate).
\bibitem{journal:cartwright} Simpson's Rule Cumulative Integration with MS Excel and Irregularly-spaced Data / Cartwright, Kenneth V. // Journal of Mathematical Sciences and Mathematics Education. -- 2017. -- Vol.~12~(2) -- P.~1-9.
\bibitem{links:tiobe_index} TIOBE. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://www.tiobe.com/tiobe-index/} (\LiteratureAccessDate).
\end{thebibliography}