Сообщество Engee

Изоклины и поля направлений

Автор
avatar-artpgchartpgch
Notebook

Исследование поля направлений и изоклин дифференциального уравнения

Введение

Дифференциальные уравнения представляют собой мощный инструмент для описания динамических процессов в природе, технике и экономике. Однако их аналитическое решение не всегда возможно, а зачастую и не необходимо для понимания общего поведения системы. В таких случаях на помощь приходят качественные методы анализа, среди которых особое место занимает визуализация полей направлений и изоклин.

В данном примере мы исследуем уравнение с помощью современных вычислительных инструментов языка Julia. Мы не только построим математическую модель, но и создадим наглядную визуализацию, позволяющую интуитивно понять структуру решений этого уравнения. Использование библиотек Plots.jl и DifferentialEquations.jl демонстрирует, как современные вычислительные технологии делают сложные математические концепции доступными и наглядными.

Присоединим необходимые библиотеки.

In [ ]:
using DifferentialEquations, LinearAlgebra

Определение функции и начальных условий

Определим функцию изоклин. Эта простая функция задает семейство изоклин - кривых постоянного наклона.
Для уравнения изоклины представляют собой параболы, смещённые по вертикали.

In [ ]:
функция_изоклины(x, R) = x.^2 .+ R
Out[0]:
функция_изоклины (generic function with 1 method)

Зададим границы области построения по осям и .
Также определим диапазон параметра для изоклин - это создаст разнообразное семейство кривых.

In [ ]:
x_мин = -4.0
x_макс = 4.0
y_мин = -4.0
y_макс = 4.0
R_мин = -2
R_макс = 2

Изоклины

Создадим основной холст для нашего графика с удобными размерами.

In [ ]:
основной_график = plot(size=(800, 600), grid=true, legend=:best);

В этом цикле создадим само семейство изоклин - каждая линия соответствует своему значению .
Чем плотнее изоклины, тем быстрее меняется наклон решения в этой области.

In [ ]:
for R_текущее in R_мин:1:R_макс
    x_значения = range(x_мин, x_макс, length=100)
    y_значения = функция_изоклины(x_значения, R_текущее)
    plot!(основной_график, x_значения, y_значения, linewidth=2, label="R = $R_текущее")
end

Сформируем равномерную сетку точек по осям и для построения векторов.
Эти точки станут начальными координатами для поля направлений.

In [ ]:
сетка_x = range(x_мин, x_макс, length=15)
сетка_y = range(y_мин, y_макс, length=15)

Поле направлений

Подготовим массивы для хранения данных о векторах.
Каждому вектору нужны начальная точка и компоненты направления .

In [ ]:
x_векторы = Float64[]
y_векторы = Float64[]
u_компоненты = Float64[]
v_компоненты = Float64[]

В этом двойном цикле вычислим направление каждого вектора поля.

In [ ]:
for x in сетка_x
    for y in сетка_y
        производная_y = y - x^2
        производная_x = 1.0
        длина = norm([производная_x, производная_y])
        if длина > 0
            push!(x_векторы, x)
            push!(y_векторы, y)
            push!(u_компоненты, 0.4производная_x/длина)
            push!(v_компоненты, 0.4производная_y/длина)
        end
    end
end

Добавим поле направлений к нашему графику красными линиями.

In [ ]:
quiver!(основной_график, x_векторы, y_векторы, quiver=(u_компоненты, v_компоненты), 
        color=:red, linewidth=1.5, label="Поле направлений"); 

Дифференциальное уравнение

Определим дифференциальную систему - это ядро нашей задачи.
Функция возвращает производную в точке , определяя локальное поведение решений.

In [ ]:
function система_ОДУ(переменные, параметры, x)
    y = переменные[1]
    return [y - x^2]
end

Определим начальные условия для интегральных кривых.
Для лучшего визуального различия, назначим каждому решению свой цвет линии.

In [ ]:
начальные_условия = [-3.0, -1.0, 1.0, 3.0]
цвета = [:green, :magenta, :cyan, :black]
стили_линий = [:dash, :dash, :dash, :dash]

Решение и визуализация

Численно решим ОДУ для каждого начального условия.
Высокая точность вычислений гарантирует плавные и точные интегральные кривые.

In [ ]:
for (индекс, y_начальное) in enumerate(начальные_условия)
    начальный_вектор = [y_начальное]
    интервал_времени = (x_мин, x_макс)
    задача = ODEProblem(система_ОДУ, начальный_вектор, интервал_времени)
    решение = solve(задача, Tsit5(), reltol=1e-8, abstol=1e-8)
end

Построим полученный график.

In [ ]:
xlabel!("x")
ylabel!("y")
title!("Поле направлений и изоклины уравнения dy/dx = y - x²")
xlims!(x_мин - 0.5, x_макс + 0.5)
ylims!(y_мин - 0.5, y_макс + 0.5)
plot!(top_margin = 8Plots.mm)
display(основной_график)

Финальный результат показывает всю красоту и структуру дифференциального уравнения.

Заключение

Проведённое исследование наглядно демонстрирует визуальные методы в анализе дифференциальных уравнений. Построенное поле направлений в сочетании с семейством изоклин образует своеобразную "карту местности", позволяющую предсказать поведение решений без их явного нахождения. Интегральные кривые, рассчитанные численными методами, подтверждают правильность качественного анализа и показывают, как различные начальные условия приводят к различным траекториям в фазовом пространстве.

Особую ценность представляет практическая реализация метода в среде Engee, который сочетает в себе вычислительную эффективность и простоту синтаксиса языка Julia. Полученная визуализация служит прекрасным учебным материалом, демонстрируя единство аналитических и численных методов в современной математике. Такой подход открывает новые возможности для представления сложных математических концепций и проведения исследований в различных научных областях, где дифференциальные уравнения служат основным инструментом моделирования.