Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c44ed2bac | ||
|
|
9492ee20b1 | ||
|
|
52cdcfbade
|
||
|
|
3fad2bd5dd
|
||
|
|
6dab995e76
|
||
|
|
ef87c08cb5
|
||
|
|
b8636adb4c
|
||
|
|
8e9ca19f17
|
||
|
|
99756b48de
|
||
|
|
5c3084deeb
|
||
|
|
29ef7018a5
|
||
|
|
63d5668224
|
||
|
|
cba0a8514d
|
||
|
|
c1ee0fe5ce
|
||
|
|
a25e301f1e
|
||
|
|
a2d84c7583
|
||
|
|
4ad96347fb
|
||
|
|
b39269901c
|
||
|
|
be0a196457
|
||
|
|
58b7923412
|
||
|
|
00ca3f92e7
|
||
|
|
5f0e792396
|
||
|
|
0f23ddeecc
|
||
|
|
c3fe366e2c
|
||
|
|
4e0737ce02
|
||
|
|
eff5d82eb6
|
||
|
|
55f7077896
|
||
|
|
fd0d028c97
|
||
|
|
e885a649b2
|
||
|
|
a70592186a
|
||
|
|
4887f3ba2a
|
||
|
|
9315741d73
|
||
|
|
6dce1980d7
|
||
|
|
afc4b083ec
|
||
|
|
36f397d6aa
|
||
|
|
f1a6257b45
|
||
|
|
1285da87e5
|
||
|
|
36c728cddd
|
||
|
|
e668810916
|
||
|
|
da1e6ef1db
|
||
|
|
2f25ade43e
|
||
|
|
eef44ba60d
|
||
|
|
267497e79c
|
||
|
|
587dd77d25
|
||
|
|
a8e7135654
|
||
|
|
4f0cdcee0e
|
||
|
|
f1a1387324
|
||
|
|
cc89b81190
|
||
|
|
897e02bcd0 | ||
|
|
5ab4a6e67c
|
||
|
|
d6d49c20c8
|
||
|
|
3b0be1e278
|
||
|
|
eaefd97207
|
||
|
|
00c4150eba | ||
|
|
ef528d67d8 | ||
|
|
a34f5fcb46 | ||
|
|
c942ad80ab | ||
|
|
dcbdd6fb2e | ||
|
|
eee0efbbd8 | ||
|
|
0c10d10c70 | ||
|
|
6e07baaa90 | ||
|
|
625a5ba66a | ||
|
|
499d5813f0 | ||
|
|
c1c4dc859d | ||
|
|
c80fa26772 | ||
|
|
f0e8547d32 | ||
|
|
91ede3f03f | ||
|
|
e28130caef |
@@ -0,0 +1,3 @@
|
||||
cache
|
||||
literature
|
||||
.vscode
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"latex-workshop.latex.outDir": "%DIR%/cache",
|
||||
"latex-workshop.latex.recipes": [
|
||||
{
|
||||
"name": "pdflatex",
|
||||
"tools": [
|
||||
"pdflatex"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "latexmk (xelatex)",
|
||||
"tools": [
|
||||
"xelatexmk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "latexmk",
|
||||
"tools": [
|
||||
"latexmk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "latexmk (latexmkrc)",
|
||||
"tools": [
|
||||
"latexmk_rconly"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pdflatex -> bibtex -> pdflatex * 2",
|
||||
"tools": [
|
||||
"pdflatex",
|
||||
"bibtex",
|
||||
"pdflatex",
|
||||
"pdflatex"
|
||||
]
|
||||
},
|
||||
],
|
||||
"latex-workshop.latex.tools": [
|
||||
{
|
||||
"name": "latexmk",
|
||||
"command": "latexmk",
|
||||
"args": [
|
||||
"-synctex=1",
|
||||
"-interaction=nonstopmode",
|
||||
"-file-line-error",
|
||||
"-pdf",
|
||||
"-shell-escape",
|
||||
"-outdir=%OUTDIR%",
|
||||
"%DOC%"
|
||||
],
|
||||
"env": {}
|
||||
},
|
||||
{
|
||||
"name": "xelatexmk",
|
||||
"command": "latexmk",
|
||||
"args": [
|
||||
"-synctex=1",
|
||||
"-interaction=nonstopmode",
|
||||
"-file-line-error",
|
||||
"-xelatex",
|
||||
"-outdir=%OUTDIR%",
|
||||
"%DOC%"
|
||||
],
|
||||
"env": {}
|
||||
},
|
||||
{
|
||||
"name": "latexmk_rconly",
|
||||
"command": "latexmk",
|
||||
"args": [
|
||||
"%DOC%"
|
||||
],
|
||||
"env": {}
|
||||
},
|
||||
{
|
||||
"name": "pdflatex",
|
||||
"command": "pdflatex",
|
||||
"args": [
|
||||
"-synctex=1",
|
||||
// "-recorder",
|
||||
"-shell-escape",
|
||||
"-interaction=nonstopmode",
|
||||
"-file-line-error",
|
||||
"-output-directory=%OUTDIR%",
|
||||
"%DOC%"
|
||||
],
|
||||
"env": {}
|
||||
},
|
||||
{
|
||||
"name": "bibtex",
|
||||
"command": "bibtex",
|
||||
"args": [
|
||||
"%DOCFILE%"
|
||||
],
|
||||
"env": {}
|
||||
},
|
||||
{
|
||||
"name": "tectonic",
|
||||
"command": "tectonic",
|
||||
"args": [
|
||||
"--synctex",
|
||||
"--keep-logs",
|
||||
"%DOC%.tex"
|
||||
],
|
||||
"env": {}
|
||||
}
|
||||
],
|
||||
"latex-workshop.latex.rootFile.indicator": "\\begin{document}",
|
||||
"latex-workshop.latex.recipe.default": "lastUsed",
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
\clearpage
|
||||
\titlecontents{section}
|
||||
[1.5em] % 1.5em (chapter) + 2.3em
|
||||
{}
|
||||
{\thecontentslabel \hspace{3mm}}
|
||||
{\hspace*{-2.3em}}
|
||||
{\titlerule*[2mm]{.}\contentspage}
|
||||
|
||||
\titleformat{\section}
|
||||
{\normalfont\fontsize{17.28}{15}\bfseries}{\thesection}{1em}{}
|
||||
\renewcommand*{\thesection}{Приложение~\Alph{section}.}
|
||||
|
||||
\chapter*{Приложения}
|
||||
\addcontentsline{toc}{chapter}{Приложения}
|
||||
\appendix
|
||||
|
||||
|
||||
\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}
|
||||
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 62 KiB |
@@ -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()
|
||||
@@ -0,0 +1,15 @@
|
||||
\chapter*{Заключение}
|
||||
|
||||
В ходе выполнения работы были выполнены поставленные задачи, цель
|
||||
достигнута. В ходе исследования возможностей библиотек выяснилось,
|
||||
что они не содержат реализаций численных методов для
|
||||
решения систем нелинейных уравнений.
|
||||
|
||||
В целом, в ходе работы с библиотеками стоит отметить положительные
|
||||
стороны: гибкость интерфейсов, высокое качество решений, большое
|
||||
количество доступной информации о результатах работы алгоритма.
|
||||
|
||||
Из недостатков интерфейса библиотек можно отметить его неоднородность ---
|
||||
некоторые численные методы реализованы с помощью классов, другие
|
||||
с помощью функций, что может незначительно увеличить время на
|
||||
освоение интерфейса библиотек и ее возможностей пользователями.
|
||||
@@ -0,0 +1,257 @@
|
||||
\documentclass[oneside,final,14pt]{extreport}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T2A,T1]{fontenc}
|
||||
\usepackage[russian]{babel}
|
||||
\usepackage{threeparttable}
|
||||
\usepackage[labelsep=endash,tableposition=top,labelfont=md,textfont=md]{caption}
|
||||
\usepackage{indentfirst}
|
||||
\usepackage{float}
|
||||
\usepackage{rotating}
|
||||
\usepackage{setspace}
|
||||
\usepackage{array}
|
||||
\usepackage{graphicx}
|
||||
\usepackage[compact]{titlesec}
|
||||
\usepackage{titletoc}
|
||||
\usepackage{xinttools}
|
||||
\usepackage{ragged2e}
|
||||
\usepackage{listingsutf8}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{color}
|
||||
\usepackage{xstring}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{mathtools}
|
||||
\usepackage[strict=true]{csquotes}
|
||||
\usepackage[abspath]{currfile}
|
||||
\usepackage[hidelinks,linktoc=all]{hyperref}
|
||||
|
||||
% ОТЛАДОЧНЫЕ ФУНКЦИИ --------------------
|
||||
% \usepackage{showframe}
|
||||
|
||||
% ПОЛЯ ----------------------------------
|
||||
\usepackage{geometry}
|
||||
\geometry{
|
||||
a4paper,
|
||||
% total={170mm,257mm},
|
||||
left=30mm,
|
||||
top=15mm,
|
||||
right=15mm,
|
||||
bottom=20mm
|
||||
}
|
||||
|
||||
% ОФОРМЛЕНИЕ СОДЕРЖАНИЯ -----------------
|
||||
\addto\captionsrussian{
|
||||
\renewcommand{\contentsname}%
|
||||
{\normalsize \MakeUppercase{Содержание}}%
|
||||
}
|
||||
\dottedcontents{chapter}[0cm]{}{1em}{2mm}
|
||||
\titlecontents{chapter}
|
||||
[0em]
|
||||
{}
|
||||
{\thecontentslabel. }
|
||||
{}
|
||||
{\titlerule*[2mm]{.}\contentspage}
|
||||
|
||||
\titlecontents{section}
|
||||
[1.5em] % 1.5em (chapter) + 2.3em
|
||||
{}
|
||||
{\thecontentslabel. }
|
||||
{\hspace*{-2.3em}}
|
||||
{\titlerule*[2mm]{.}\contentspage}
|
||||
|
||||
\titlecontents{subsection}
|
||||
[3.5em] % 1.5em (chapter) + 2.3em
|
||||
{}
|
||||
{\thecontentslabel. }
|
||||
{\hspace*{-2.3em}}
|
||||
{\titlerule*[2mm]{.}\contentspage}
|
||||
|
||||
% ОФОРМЛЕНИЕ ЗАГОЛОВКОВ -----------------
|
||||
% В т.ч. и содержания
|
||||
\titleformat{\paragraph}[runin]
|
||||
{\normalfont\normalsize\bfseries}{\theparagraph}{1em}{}
|
||||
\titlespacing*{\paragraph} {\parindent}{3.25ex plus 1ex minus .2ex}{1em}
|
||||
\titleformat{\chapter}[display]{\normalfont\large\bfseries}{}{0cm}{\large\centering}
|
||||
\titleformat{\section}
|
||||
{\normalfont\large\bfseries}{\thesection}{5mm}{}
|
||||
\makeatletter
|
||||
% NormalTeXSyntaxON
|
||||
\def\@makechapterhead#1{%
|
||||
\vspace*{0\p@}%
|
||||
{\parindent \z@ \raggedright \normalfont \setstretch{1.2}
|
||||
\interlinepenalty\@M
|
||||
\large \bfseries \space \thechapter. #1\par\nobreak
|
||||
}}
|
||||
% NormalTeXSyntaxOFF
|
||||
\titlespacing{\chapter}{0pt}{-5mm}{0cm}
|
||||
|
||||
% ОФОРМЛЕНИЕ СПИСКОВ --------------------
|
||||
\setlist{noitemsep,align=left,left=\parindent,topsep=0pt}
|
||||
\setlist[itemize]{label=--}
|
||||
|
||||
% ОФОРМЛЕНИЕ ЛИСТИНГОВ КОДА -----------------
|
||||
\definecolor{dkgreen}{rgb}{0,0.6,0}
|
||||
\definecolor{gray}{rgb}{0.5,0.5,0.5}
|
||||
\definecolor{mauve}{rgb}{0.58,0,0.82}
|
||||
\lstset{
|
||||
frame=tb,
|
||||
language=C++,
|
||||
aboveskip=3mm,
|
||||
belowskip=3mm,
|
||||
showstringspaces=false,
|
||||
columns=flexible,
|
||||
basicstyle={\small\ttfamily},
|
||||
numbers=none,
|
||||
numberstyle=\tiny\color{gray},
|
||||
keywordstyle=\color{blue},
|
||||
commentstyle=\color{dkgreen},
|
||||
stringstyle=\color{mauve},
|
||||
breaklines=true,
|
||||
breakatwhitespace=true,
|
||||
tabsize=3,
|
||||
escapechar={|},
|
||||
emptylines=0,
|
||||
extendedchars=true,
|
||||
literate={а}{{\cyra}}1
|
||||
{б}{{\cyrb}}1
|
||||
{в}{{\cyrv}}1
|
||||
{г}{{\cyrg}}1
|
||||
{д}{{\cyrd}}1
|
||||
{е}{{\cyre}}1
|
||||
{ё}{\"{\cyre}}1
|
||||
{ж}{{\cyrzh}}1
|
||||
{з}{{\cyrz}}1
|
||||
{и}{{\cyri}}1
|
||||
{й}{{\cyrishrt}}1
|
||||
{к}{{\cyrk}}1
|
||||
{л}{{\cyrl}}1
|
||||
{м}{{\cyrm}}1
|
||||
{н}{{\cyrn}}1
|
||||
{о}{{\cyro}}1
|
||||
{п}{{\cyrp}}1
|
||||
{р}{{\cyrr}}1
|
||||
{с}{{\cyrs}}1
|
||||
{т}{{\cyrt}}1
|
||||
{у}{{\cyru}}1
|
||||
{ф}{{\cyrf}}1
|
||||
{х}{{\cyrh}}1
|
||||
{ц}{{\cyrc}}1
|
||||
{ч}{{\cyrch}}1
|
||||
{ш}{{\cyrsh}}1
|
||||
{щ}{{\cyrshch}}1
|
||||
{ъ}{{\cyrhrdsn}}1
|
||||
{ы}{{\cyrery}}1
|
||||
{ь}{{\cyrsftsn}}1
|
||||
{э}{{\cyrerev}}1
|
||||
{ю}{{\cyryu}}1
|
||||
{я}{{\cyrya}}1
|
||||
{А}{{\CYRA}}1
|
||||
{Б}{{\CYRB}}1
|
||||
{В}{{\CYRV}}1
|
||||
{Г}{{\CYRG}}1
|
||||
{Д}{{\CYR96}}1
|
||||
{Е}{{\CYRE}}1
|
||||
{Ё}{{\"{\CYRE}}}1
|
||||
{Ж}{{\CYRZH}}1
|
||||
{З}{{\CYRZ}}1
|
||||
{И}{{\CYRI}}1
|
||||
{Й}{{\CYRISHRT}}1
|
||||
{К}{{\CYRK}}1
|
||||
{Л}{{\CYRL}}1
|
||||
{М}{{\CYRM}}1
|
||||
{Н}{{\CYRN}}1
|
||||
{О}{{\CYRO}}1
|
||||
{П}{{\CYRP}}1
|
||||
{Р}{{\CYRR}}1
|
||||
{С}{{\CYRS}}1
|
||||
{Т}{{\CYRT}}1
|
||||
{У}{{\CYRU}}1
|
||||
{Ф}{{\CYRF}}1
|
||||
{Х}{{\CYRH}}1
|
||||
{Ц}{{\CYRC}}1
|
||||
{Ч}{{\CYRCH}}1
|
||||
{Ш}{{\CYRSH}}1
|
||||
{Щ}{{\CYRSHCH}}1
|
||||
{Ъ}{{\CYRHRDSN}}1
|
||||
{Ы}{{\CYRERY}}1
|
||||
{Ь}{{\CYRSFTSN}}1
|
||||
{Э}{{\CYREREV}}1
|
||||
{Ю}{{\CYRYU}}1
|
||||
{Я}{{\CYRYA}}1
|
||||
}
|
||||
\newcommand\inputcode[3][]{
|
||||
{\bfseries #1\filename{#2}}:
|
||||
\lstinputlisting[%
|
||||
#3,
|
||||
]{#2}%
|
||||
}
|
||||
|
||||
% ОФОРМЛЕНИЕ НУМЕРАЦИИ СПИСКОВ ----------------------------------
|
||||
% Команды ниже переназначают алфавит используемый при нумерации с английского на русский
|
||||
\makeatletter
|
||||
\renewcommand*{\@alph}[1]{%
|
||||
\ifcase#1\or а\or б\or в\or г\or
|
||||
д\or е\or ё\or ж\or з\or и\or й\or
|
||||
к\or л\or м\or н\or о\or п\or р\or с\or т\or
|
||||
у\or ф\or х\or ц\or ч\or
|
||||
ш\or щ\or ы\or э\or у \or я
|
||||
\else\@ctrerr\fi
|
||||
}
|
||||
\renewcommand*{\@Alph}[1]{%
|
||||
\ifcase#1\or А\or Б\or В\or Г\or
|
||||
Д\or Е\or Ё\or Ж\or З\or И\or Й\or
|
||||
К\or Л\or М\or Н\or О\or П\or Р\or С\or Т\or
|
||||
У\or Ф\or Х\or Ц\or Ч\or
|
||||
Ш\or Щ\or Ы\or Э\or У\or Я
|
||||
\else\@ctrerr\fi
|
||||
}
|
||||
\makeatother
|
||||
\makeatletter
|
||||
\renewcommand\@biblabel[1]{#1.}
|
||||
\makeatother
|
||||
|
||||
|
||||
% file path
|
||||
\newcommand{\runtimeFsep}{/}
|
||||
\newcommand{\updateRuntimeFsep}{\IfSubStr{\currfileabsdir}{/}{}{\renewcommand{\runtimeFsep}{\backslash}}}
|
||||
\updateRuntimeFsep
|
||||
|
||||
\makeatletter
|
||||
\DeclareRobustCommand{\filename}[2][]{%
|
||||
\begingroup
|
||||
% \lstname seems to change hyphens into \textendash
|
||||
\def\textendash{-}%
|
||||
\filename@parse{#2}%
|
||||
\IfSubStr{\filename@base}{\runtimeFsep}{\filename@parse{\filename@base}}{}%
|
||||
\edef\filename@base{\detokenize\expandafter{\filename@base}}%
|
||||
#1{\filename@base.\filename@ext}%
|
||||
\endgroup
|
||||
}
|
||||
\makeatother
|
||||
|
||||
% \section*{#1}%
|
||||
% \addcontentsline{toc}{chapter}{#1}
|
||||
\newcommand\tcchapter[1]{%
|
||||
\chapter{#1}%
|
||||
}
|
||||
\newcommand\tcsection[1]{%
|
||||
\section{#1}%
|
||||
}
|
||||
\onehalfspacing
|
||||
|
||||
% \contentsmargin{2.55em}
|
||||
|
||||
\addto\captionsrussian{\renewcommand{\figurename}{Рисунок }}
|
||||
|
||||
% URL ---------------
|
||||
\urlstyle{same}
|
||||
|
||||
% ОФОРМЛЕНИЕ ТЕКСТА
|
||||
\renewcommand{\baselinestretch}{1.5}
|
||||
\MakeOuterQuote{"}
|
||||
|
||||
\newenvironment{nospaceflalign*}
|
||||
{\setlength{\abovedisplayskip}{0pt}\setlength{\belowdisplayskip}{0pt}%
|
||||
\csname flalign*\endcsname}
|
||||
{\csname endflalign*\endcsname\ignorespacesafterend}
|
||||
@@ -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}
|
||||
|
||||
Данные методы самостоятельно вызываются при запуске программы
|
||||
пользователем.
|
||||
|
||||
Вывод терминала а также графики для остальных методов приведены
|
||||
в приложении А.
|
||||
|
||||
Код программы приведен в приложении Б.
|
||||
@@ -0,0 +1,47 @@
|
||||
\chapter*{Введение}
|
||||
\addcontentsline{toc}{chapter}{Введение}
|
||||
В ходе решения решения задач физики, экономики а также множества
|
||||
практических задач одним из необходимых этапов является построение
|
||||
математической модели, а после начала компьютеризации общества
|
||||
--- разработка программы для ЭВМ или выбор уже существующих \cite[с. 4]{book:nm-examples}.
|
||||
|
||||
Также стоит учитывать, что решение любой практической задачи, либо
|
||||
проведение исследования, подразумевает ограниченность по времени
|
||||
и ресурсам \hbox{\cite[с.~15]{book:bahvalov}}. Развитие ЭВМ и их
|
||||
всеобщее распространение
|
||||
привело к тому, что разработка библиотек программного кода для
|
||||
решения математических задач с использованием заданного языка
|
||||
программирования стала повсеместной. Язык программирования
|
||||
Python \cite{links:python} --- один из самых популярных на протяжении
|
||||
лет \cite{links:tiobe_index}, широко используется при решении многих
|
||||
практических задач, в том числе и математической направленности.
|
||||
|
||||
Для данного языка существуют библиотеки numpy
|
||||
\cite{links:numpy} и scipy \cite{links:scipy},
|
||||
предназначенные для математических расчетов.
|
||||
Понимание их возможностей в области численных методов позволит
|
||||
снизить затраты времени и ресурсов на разработку программы для
|
||||
ЭВМ, либо не увеличит их в случае, когда применение данных
|
||||
библиотек в силу тех или иных причин невозможно.
|
||||
|
||||
Проблема состоит в том, что на данный момент особенности библиотек,
|
||||
полнота их возможностей с точки зрения решения задач численными
|
||||
методами недостаточно исследованы.
|
||||
|
||||
\textbf{Целью} данной работы является исследование вышеприведенных характеристик данных библиотек.
|
||||
|
||||
Для достижения цели курсового проекта необходимо выполнить следующие \textbf{задачи}:
|
||||
\begin{enumerate}
|
||||
\item Изучить распространенные численные методы решения основных
|
||||
классов задач.
|
||||
\item Изучить документацию библиотек numpy и scipy на предмет
|
||||
реализации рассмотренных методов.
|
||||
\item Экспериментально исследовать возможности реализаций
|
||||
рассмотренных численных методов данных библиотек.
|
||||
\end{enumerate}
|
||||
|
||||
В данной работе используются язык Python, библиотеки numpy и
|
||||
scipy версий \(3.11\), \(1.25\) и \(1.11\) соответственно.
|
||||
|
||||
Курсовой проект включает введение, две главы,
|
||||
заключение, библиографический список и приложение.
|
||||
@@ -0,0 +1,178 @@
|
||||
\documentclass{beamer}
|
||||
\usepackage[russian]{babel}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[outputdir=cache]{minted}
|
||||
|
||||
\input{vars.tex}
|
||||
|
||||
\usetheme{Madrid}
|
||||
\usecolortheme{dove}
|
||||
\setbeamertemplate{blocks}[rounded][shadow=false]
|
||||
|
||||
\title[]{\cwtitle}
|
||||
\institute[]{ФГБОУ ВО «Вятский государственный университет»}
|
||||
\date{\null}
|
||||
\author[ ]{Студент ПМИб-3301-52-00 \cwauthor \newline \and к.п.н. А.Н.~Соколова}
|
||||
|
||||
\newcommand\frametitleSpec[1]{%
|
||||
\frametitle{#1}
|
||||
\section{#1}%
|
||||
}
|
||||
|
||||
|
||||
% set captions with numbers
|
||||
\setbeamertemplate{caption}[numbered]
|
||||
|
||||
\begin{document}
|
||||
\begin{frame}
|
||||
\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 \textbf{Целью} данной работы является исследование
|
||||
вышеприведенных характеристик данных библиотек.
|
||||
\item Для достижения цели курсового проекта необходимо выполнить
|
||||
следующие \textbf{задачи}:
|
||||
\begin{itemize}
|
||||
\item Изучить распространенные численные методы решения
|
||||
основных классов задач.
|
||||
\item Изучить документацию библиотек numpy и scipy на
|
||||
предмет реализации рассмотренных методов.
|
||||
\item Экспериментально исследовать возможности
|
||||
реализаций рассмотренных численных методов данных
|
||||
библиотек.
|
||||
\end{itemize}
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\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]{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}
|
||||
{\huge Спасибо за внимание!}
|
||||
\end{center}
|
||||
\end{frame}
|
||||
\end{document}
|
||||
@@ -0,0 +1,28 @@
|
||||
\newcommand{\LiteratureAccessDate}[1][1]{%
|
||||
дата~обращения: \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{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{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}
|
||||
@@ -0,0 +1,53 @@
|
||||
\begin{titlepage}
|
||||
\begin{center}
|
||||
\begin{small}
|
||||
\begin{singlespace}
|
||||
\MakeUppercase{
|
||||
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ\\ \vspace{0.7em}
|
||||
Федеральное государственное бюджетное образовательное учреждение высшего образования\\
|
||||
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ\\ \vspace{0.7em}
|
||||
Институт математики и информационных систем \\ \vspace{0.7em}
|
||||
Факультет компьютерных и физико-математических наук\\ \vspace{0.7em}
|
||||
Кафедра прикладной математики и информатики
|
||||
}
|
||||
\end{singlespace}
|
||||
\end{small}
|
||||
\vfill
|
||||
{\null\hfill
|
||||
\begin{minipage}{0.4\textwidth}
|
||||
Допущена к защите\\
|
||||
{\setstretch{2}
|
||||
заведующей кафедрой прикладной
|
||||
математики и информатики\\}
|
||||
{\rule{3cm}{0.1mm}}~Е.В.Разова
|
||||
\end{minipage}
|
||||
|
||||
}
|
||||
\vspace{5em}
|
||||
|
||||
{
|
||||
\large{
|
||||
{\bfseries \cwtitle}
|
||||
}}
|
||||
\vspace{2em}
|
||||
|
||||
Курсовой проект по дисциплине <<\cwdiscipline>>
|
||||
\end{center}
|
||||
\vfill
|
||||
\begin{table}[ht]
|
||||
\centering
|
||||
\begin{tabularx}{\textwidth}{>{\raggedright\arraybackslash}X>{\raggedright\arraybackslash}X}
|
||||
Выполнил студент группы \mbox{\cwauthorPosition} \vspace{1mm} & {{\rule{3cm}{0.1mm}}~/\cwauthor}/ \\
|
||||
\cwdirectorPosition \vspace{10mm} & {{\rule{3cm}{0.1mm}}~/\cwdirector/} \\
|
||||
Работа защищена с оценкой & {\rule{3cm}{0.1mm}} \hspace{3mm} {\rule{1cm}{0.1mm}}.{\rule{1cm}{0.1mm}} \the\year\ г. \vspace{1cm} \\
|
||||
Члены комиссии \vspace{2mm} & {\rule{3cm}{0.1mm}} \hspace{3mm} /{\rule{3.5cm}{0.1mm}}/ \\
|
||||
\null & {\rule{3cm}{0.1mm}} \hspace{3mm} /{\rule{3.5cm}{0.1mm}}/ \\
|
||||
\end{tabularx}
|
||||
\end{table}
|
||||
\vfill
|
||||
|
||||
\begin{center}
|
||||
Киров \the\year\ г.
|
||||
\end{center}
|
||||
\end{titlepage}
|
||||
\setcounter{page}{2}
|
||||
@@ -0,0 +1,6 @@
|
||||
\newcommand{\cwtitle}[0]{Исследование возможностей библиотек numpy и scipy для реализации численных методов}
|
||||
\newcommand{\cwauthorPosition}[0]{ПМИб-3301-52-00}
|
||||
\newcommand{\cwauthor}[0]{Г.Е.~Ступников}
|
||||
\newcommand{\cwdirectorPosition}[0]{Руководитель к.пед.н., доцент \mbox{кафедры ПМИ}}
|
||||
\newcommand{\cwdirector}[0]{А.Н.~Соколова}
|
||||
\newcommand{\cwdiscipline}[0]{Численные методы}
|
||||