Exemplo n.º 1
0
def base_finite_diff_method(a, b, ua, ub, f, n):
    # Строим сетку по заданному разбиению
    grid = build_grid(a, b, n)
    # Получаем три столбца - диагонали матрицы коэффециентов
    matrix = build_coef_matrix(grid)
    # Получаем вектор значений правой части
    values = build_values_vector(grid, f, ua, ub)
    # Решаем систему методом прогонки
    ans = progonka(matrix, values)
    return grid, ans
def special_finite_diff_method(n, a, b, ua, ub, q, f, k1, k2, k3):
    # Строим сетку по заданному разбиению
    grid = build_grid(a, b, n)
    # Получаем трёхдиагональную матрицу коэффициентов системы уравнений
    matrix = build_coef_matrix(grid, q, k1, k2, k3)
    # Получаем вектор значений правой части
    values = build_values_vector(grid, f, ua, ub)
    # Решаем систему методом прогонки
    ans = progonka(matrix, values)
    return grid, ans
def vector_euler(t0, T, y0, A, b, n):
    size = A.shape[0]  # Кол-во уравнений
    h = (T - t0) / n
    grid = build_grid(t0, T, n)
    y = [y0]
    for i in range(n):
        # Умножение матрицы на вектор
        # (np.identity(size) + h * A) @ y[i] - аналогично
        y.append(np.dot((np.identity(size) + h * A), y[i]) + h * b(grid[i]))
    # Возвращаем сетку и значения искомой функции в узлах сетки
    return grid, np.asarray(y).transpose()[0]
Exemplo n.º 4
0
        r = runge_diff(y1, y2, n, method_order)
    return x2, y2, 2 * n


a = 0
b = 2
ua = -3
ub = 3
n = 10
eps = 0.001
f = lambda x: 3 * x + x * x
g = lambda x: ua + (ub - ua) / b * x
ans = lambda x: 1 / 12 * (-(x**4) - 6 * (x**3) + 68 * x - 36)

h = b / n
h_grid = build_grid(a, b, n)
x, u, n = runge_rule(a,
                     b,
                     ua,
                     ub,
                     f,
                     eps=eps,
                     method=base_finite_diff_method,
                     method_order=2)

plt.figure(dpi=200)
plt.plot(x, ans(x), 'r--', label='Точное решение t --> inf')
plt.plot(x, u, 'bo', label='МКР')
plt.ylabel('u')
plt.xlabel('x')
plt.legend(loc='best')
q = 0.25
f = lambda x: -(x * x) + 2.5 * x + 1.25
g = lambda x: ua + (ub - ua) / b * x
# best order - k2 k3 k1
k1 = lambda x: 7 - x
k2 = lambda x: np.log(x * x + 2)
k3 = lambda x: 5 * (x + 2) * (x + 2)
k4 = lambda x: 1

n = 60
m = 800

h = b / n
# t <= h * h / 2
t = h * h / 2 * 0.9
h_grid = build_grid(a, b, n)
t_grid = build_grid(0, m * t, m)
u = special_explicit_method(h_grid, t_grid, ua, ub, q, g, f, k4, k4, k4)

step = m // 5
for i in range(5):
    ind = (i + 1) * step - 1
    plot_graph(h_grid, u[ind], 'bo', 't = ' + str(round(t * ind, 2)), xlabel='x', ylabel='u')

fig = plt.figure()
ax = plt.axes(xlim=(a, b), ylim=(0, 2 * ub))


def animate(frame_num):
    ax.clear()
    graph = plt.plot(h_grid, u[frame_num], 'bo')