11Особые точки нелинейных систем на плоскости

В предыдущей главе мы обсудили, как устроены особые точки линейных систем на плоскости. Но что мы будем делать, если нам встретится нелинейное уравнение?

11.1Линеаризация особой точки

Рассмотрим систему
Пусть точка является положением равновесия, то есть особой точкой нашей системы. В этом случае и . Чтобы не писать каждый раз две переменные, введём векторные обозначения: и . Система принимает вид
Мы предполагаем, что функции и по крайней мере -гладкие (то есть имеют непрерывные частные производные) и значит отображение является дифференцируемым. Из определения производной для функции нескольких переменных следует, что
Здесь — матрица Якоби для отображения , то есть матрица, составленная из частных производных функций и . Обозначим эту матрицу через :
Заметим, что в (11.3) слагаемое равно нулю, поскольку является особой точкой.

Сделаем замену переменных: . Таким образом мы перенесли особую точку в начало координат. Соотношение (11.3) принимает вид

И уравнение (11.2) записывается таким образом:
Если отбросить второе слагаемое , малое по сравнению с первым, получится система
являющаяся линейной. Она называется линеаризацией нелинейной системы (11.2) в особой точке .

Как связаны решения нелинейной системы с решениями её линеаризации в окрестности особой точки? Отброшенное при переходе к линеаризации слагаемое является очень маленьким, и чем ближе мы к особой точке, тем оно меньше. Можем ли мы им пренебречь, если нас интересует поведение системы вблизи особой точки, по крайней мере, на каком-то качественном уровне? Оказывается, ответ зависит от типа получившейся линейной особой точки.

11.2Свойства нелинейных особых точек

Говорят, что нелинейная особая точка является, например, центром по линейным членам, если её линеаризация является центром. Аналогично с другими типами особых точек.

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

11.2.1Невырожденный узел

Фазовые портреты линейных узлов выглядят по-разному в зависимости от типа узла. Если узел невырожденный, то есть собственные значения различны и существуют два разных собственных вектора, то почти все траектории стремятся к особой точке (в прямом или обратном времени), касаясь того собственного вектора, чьё собственное значение меньше по модулю. Фазовые кривые похожи на ветви парабол. Исключение составляют траектории с начальными условиями, лежащими на том собственном векторе, у которого собственное значение больше по модулю.

Например, у системы

собственные векторы — с собственным значением 1 и с собственным значением 2. Решением является вектор-функция, задаваемая компонентами , . При траектория лежит на параболе
и стремится к началу координат в обратном времени (при ), касаясь горизонтального направления (то есть направления собственного вектора с меньшим по модулю собственным значением). Исключением являются траектории с : они стремятся к нулю вдоль вертикального направления (то есть вдоль собственного вектора с большим собственным значением).

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

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

Пример 1. Построим фазовый портрет системы
вблизи особой точки . Её линеаризация в этой точке имеет матрицу из примера 1 предыдущей главы.
Собственные значения и , собственные векторы и . На рис. 11.1 видно, что почти все отмеченные траектории касаются вектора .
import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

plt.figure(figsize=(12, 6))

theta = np.linspace(0, 2 * np.pi, 4 * 5 + 1)
r = 3
u = 1.5 * np.cos(theta) * r
v = 4 * np.sin(theta) * r

C = np.array([[-3, 1], [1, 1]])

def linear(X, t=0):
    return np.array([2 * X[0] + 3 * X[1], X[0] + 4 * X[1]])
def non_linear(X, t=0, linear=linear):
    return linear(X) + np.array([0.3 * X[0]**2 + 0.2 * X[1]**2, 
                                 0.1 * X[0]**2])

plt.subplot(122)
ob.axes4x4(labels=('x','y'))


ob.phaseportrait(linear,
                 (0.25 * C @ np.array([u, v])).T, [-2, 2], n=50, 
                 linewidth=1.5)

plt.arrow(0,0,-3,1,head_width=0.2, head_length=0.3,color='olive',lw=2)
plt.arrow(0,0,1,1,head_width=0.2, head_length=0.3,color='olive',lw=2)

plt.subplot(121)
ob.axes4x4(labels=('x','y'))
ob.phaseportrait(non_linear,
                 (0.25 * C @ np.array([u, v])).T, [-2, 0.3], n=50, 
                 linewidth=1.5)

plt.arrow(0,0,-3,1,head_width=0.2, head_length=0.3,color='olive',lw=2)
plt.arrow(0,0,1,1,head_width=0.2, head_length=0.3,color='olive',lw=2)
Рис. 11.1: Фазовые портреты нелинейного узла (слева) и его линеаризации (справа) в малой окрестности особой точки .
Заметим, что фазовые портреты похожи только в небольшой окрестности особой точки. Если мы удаляемся от особой точки, то нелинейные слагаемые начинают играть всё большую роль, и фазовые портреты сильно различаются, см. рис. 11.2.
import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

def linear(X, t=0):
    return np.array([2 * X[0] + 3 * X[1], X[0] + 4 * X[1]])
def non_linear(X, t=0, linear=linear):
    return linear(X) + np.array([0.3 * X[0]**2 + 0.2 * X[1]**2, 
                                 0.1 * X[0]**2])

plt.figure(figsize=(12, 6))

xmin, xmax, ymin, ymax = -10, 10, -10, 10

x = np.linspace(xmin, xmax, 500)
y = np.linspace(ymin, ymax, 500)
X, Y = np.meshgrid(x, y)
U, V = linear([X, Y])

plt.subplot(121)
ob.axes4x4(labels=('x', 'y'), xmin=xmin, xmax=xmax, ymin=ymin, 
           ymax=ymax, 
           fontsize=14)
plt.streamplot(x, y, U, V)

plt.subplot(122)
ob.axes4x4(labels=('x', 'y'), xmin=xmin, xmax=xmax, ymin=ymin, 
          ymax=ymax,
          fontsize=14)
U_, V_ = non_linear([X, Y])
plt.streamplot(x, y, U_, V_)
Рис. 11.2: Фазовые портреты нелинейной системы (справа) и её линеаризации (слева) в большой окрестности начала координат

11.2.2Дикритический узел: скалярная матрица

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

Теорема 2. Вблизи нелинейной особой точки, являющейся дикритическим узлом по линейным членам, все траектории (кроме самой особой точки) стремятся к особой точке, каждая под своим собственным углом. Для всякого ненулевого вектора, приложенного к началу координат, существует единственная траектория, касающееся этого вектора при или .

import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

plt.figure(figsize=(12, 6))

theta = np.linspace(0, 2 * np.pi, 4 * 5 + 1)
r = 4
x = np.cos(theta) * r
y = np.sin(theta) * r

plt.subplot(122)
ob.axes4x4(labels=('x', 'y'))
ob.phaseportrait(lambda X, t=0: np.array([X[0], X[1]]), 
                np.array([x, y]).T, [-4, 2], n=50, linewidth=1.5)

plt.subplot(121)
ob.axes4x4(labels=('x', 'y'))

ob.phaseportrait(lambda X, t=0: np.array([X[0] - 0.2*X[0]**2, X[1]]), 
                np.array([x, y]).T, [-4, 0.2], n=50, linewidth=1.5)
Рис. 11.3: Нелинейный дикритический узел (слева) и его линеаризация (справа).

11.2.3Вырожденный узел: жорданова клетка

Если собственные значения совпадают, но матрица не является скалярной, то она в некотором базисе является жордановой клеткой. У неё есть единственный собственный вектор и все траектории такой системы, кроме особой точки, стремятся к особой точке, касаясь этого собственного вектора.

Теорема 3. Вблизи нелинейной особой точки, являющейся вырожденным узлом по линейным членам, все траектории (кроме самой особой точки) стремятся к особой точке, касаясь единственного собственного вектора матрицы линеаризации.

import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

plt.figure(figsize=(12, 6))

y = np.linspace(-4, 4, 21)
x = y * 0.2

plt.subplot(122)
ob.axes4x4(labels=('x', 'y'))

ob.phaseportrait(lambda X, t=0: np.array([- X[0] + 3 * X[1], -X[1]]), 
                np.array([x, y]).T, [-2, 4], n=50, linewidth=1.5)

plt.subplot(121)
ob.axes4x4(labels=('x', 'y'))

ob.phaseportrait(lambda X, t=0: np.array([- X[0] + 3 * X[1] + 0.1*X[1]**2, 
                                          -X[1] + 0.05 * X[0] ** 2]), 
                np.array([x, y]).T, [-2, 4], n=50, linewidth=1.5)
Рис. 11.4: Нелинейный вырожденный узел (слева) и его линеаризация (справа) в малой окрестности особой точки.

11.2.4Фокус

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

Теорема 4. Вблизи нелинейной особой точки, являющейся фокусом по линейным членам, все траектории (кроме самой особой точки) являются спиралями, совершающими бесконечное число оборотов при при или .

11.2.5Седло

У сёдел есть два вещественных собственных значения разных знаков и, соответственно, два собственных вектора. Их фазовые кривые — ветви гипербол, кроме самой особой точки и четырёх прямолинейных лучей, называющихся сепаратрисами. Две сепаратрисы стремятся к седлу при вдоль собственного вектора с отрицательным собственным значениям (такие сепаратрисы называются входящими), две другие сепаратрисы стремятся к седлу при вдоль собственного вектора с положительным собственным значением (это исходящие сепаратрисы).

Например, для простейшего случая

входящие сепаратрисы — лучи и , а исходящие — лучи и .

У соответствующей нелинейной особой точки также существуют сепаратрисы. Они не обязаны быть прямыми, но обязаны касаться собственных векторов.

Теорема 5. Вблизи нелинейной особой точки, являющейся седлом по линейным членам, существуют две траектории, стремящиеся к особой точке при , касаясь собственного вектора с отрицательным собственным значением, и ещё две траектории, стремящиеся к особой точке при , касаясь собственного вектора с положительным собственным значением. Эти траектории называются сепаратрисами нелинейного седла.

Это — знаменитая теорема Адамара — Перрона, первый результат так называемой гиперболической динамики.

import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

from itertools import product
from scipy.integrate import odeint
from scipy.optimize import bisect

C = np.array([[2, 1], [1, -1]])
A = C @ np.diag([1, -1]) @ np.linalg.inv(C)

def find_sep(f, init_func, test_func, T=10):
    def my_test(s):
        init = init_func(s)
        out = odeint(f, init, [0, T])[1]
        return test_func(out)
    return init_func(bisect(my_test, 0, 1))

def linear_homotopy(A, B, s):
    return A*(1-s) + B*s

def linear(X, t=0):
    return np.tensordot(A, X, axes=(1, 0))

def non_linearity(X):
    return np.array([0.2*X[0]**2, -0.1*X[0]**2])

def non_linear(X, t=0):
    return linear(X) + non_linearity(X)

def draw_seps(field):
    stable_sep_inits = [find_sep(field, 
                            lambda s: linear_homotopy(*endpoints, s),
                            lambda X: X[0] + X[1], T=20)
                        for endpoints in np.array([[[-3, 0], [0, 3]],
                                                  [[0, -3], [3, 0]]])]

    unstable_sep_inits = [find_sep(lambda X, t: -field(X, t), 
                            lambda s: linear_homotopy(*endpoints, s),
                            lambda X: X[0] - X[1], T=20)
                        for endpoints in np.array([[[-3, 0], [0, -3]],
                                                  [[0, 3], [3, 0]]])]
    ob.phaseportrait(field, stable_sep_inits, t=(-1, 5), color='green')
    ob.phaseportrait(field, unstable_sep_inits, t=(-5, 1), color='red')


plt.figure(figsize=(12, 6))

plt.subplot(122)
ob.axes4x4(labels=('x','y'), fontsize=14)

x = np.linspace(-4, 4)
y = np.linspace(-4, 4)
Z = np.meshgrid(x, y)
W = linear(Z)
plt.streamplot(*Z, *W)

draw_seps(linear)

plt.subplot(121)
ob.axes4x4(labels=('x','y'), fontsize=14)

W_ = non_linear(Z)

plt.streamplot(*Z, *W_)
draw_seps(non_linear)
Рис. 11.5: Фазовый портрет нелинейного седла (слева) и его линеаризации (справа). Зелёным выделены входящие сепаратрисы, красным исходящие.

11.2.6Центр

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

Пример 2. Рассмотрим систему
Её линеаризация в нуле имеет матрицу
с собственными значениями и , то есть соответствует центру.

Чтобы построить фазовый портрет системы, перейдём в полярные координаты. Нам будет проще работать не с полярным радиусом, а с его квадратом: . Вычислим производную функции вдоль векторного поля, заданного системой (11.7):

Таким образом, имеем уравнение на :
Решение этого уравнения можно найти явно, но нам достаточно того факта, что правая часть всегда отрицательна (кроме точки ) и следовательно будет монотонно убывать. То есть траектория будет приближаться к началу координат.

Можно также найти уравнение на полярный угол . Напоминим, что . Значит по теореме о производной сложной функции: Уравнение на имеет вид

Таким образом, двигаясь по траектории, точка приближается к началу координат, при этом её полярный угол равномерно уменьшается. Значит, эта траектория — спираль, наматывающаяся на особую точку, см. рис. 11.6.
import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

plt.figure(figsize=(6, 6))
ob.axes4x4(labels=("x", "y"), xmin=-1, xmax=1,
                              ymin=-1, ymax=1)
theta = np.linspace(0, 2 * np.pi, 4 * 5 + 1)
r = 1
x = np.cos(theta) * r
y = np.sin(theta) * r
c = 1
ob.phaseportrait(lambda X, t=0: np.array(
                        [-X[1] - c*X[0]*(X[0]**2 + X[1]**2),
                         X[0] - c*X[1]*(X[0]**2 + X[1]**2)]), 
         np.array([x, y]).T, t=(-0.09, 200), n=5000, 
     head_width=0.04, head_length=0.07, linewidth=1.5)
plt.plot([0], [0], marker='o', mew=2, lw=0, markersize=5,
         markerfacecolor='white', markeredgecolor='steelblue')
Рис. 11.6: Медленный фокус.
Такая особая точка похожа на фокус, хотя её линеаризация является центром. Она называется медленным фокусом.

11.3Пример исследования нелинейной особой точки

Рассмотрим систему
Найдём её особые точки. Приравнивая правые части к нулю, получаем такую систему:
Из первого уравнения мгновенно следует, что . Подставляя эти значения для во второе уравнение находим и видим, что у системы есть две особые точки: и . Матрица Якоби имеет вид:
Рассмотрим точку . Подставляя её в матрицу Якоби, получаем матрицу линаризации:
Эта матрица нижнетреугольная и значит её собственные значения стоят на диагонали. Они равны и . Следовательно соответствующая особая точка является неустойчивым узлом.

Собственные векторы равны и . Первый из них имеет меньшее собственное значение, поэтому почти все траектории будут его касаться, стремясь к особой точке в обратном времени.

Вопрос 1. Какой тип имеет вторая особая точка?
  Тоже узел!

Неверный ответ. А вот и нет

  Это фокус

Неверный ответ. Нет, не фокус

  Центр по линейным членам

Неверный ответ. Нет.

  Седло

Верный ответ. Да! Собственные значения и . А фазовый портрет в целом выглядит вот так.

import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

plt.figure(figsize=(6, 6))

ob.axes4x4(labels=('x', 'y'))
x = np.linspace(-4, 4)
y = np.linspace(-4, 4)
X, Y = np.meshgrid(x, y)
plt.streamplot(x, y, np.log(X**2/8 + 0.5), np.arctan(Y+X+1))
plt.plot([-2, 2], [1, -3], marker='o', mew=2, lw=0, 
         markersize=5, markerfacecolor='white',
         markeredgecolor='steelblue')

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

Пример 3. В качестве примера приведём фазовые портреты двух систем с нулевой линеаризацией, см. рис. 11.8.
import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

plt.figure(figsize=(12, 6))

x = np.linspace(-4, 4)
y = np.linspace(-4, 4)
X, Y = np.meshgrid(x, y)
plt.subplot(121)
ob.axes4x4(labels=('x', 'y'))
plt.streamplot(x, y, X**2 - Y**2, -2*X*Y)
plt.subplot(122)
ob.axes4x4(labels=('x', 'y'))
plt.streamplot(x, y, X**2 - Y**2, 2*X*Y)
Рис. 11.8: Фазовые портреты систем (11.11) (слева) и (11.12) (справа)

Упражнение 1. Вы можете найти уравнения фазовых кривых для этих систем с помощью перехода к неавтономному уравнению (как обсуждалось в разделе 4.4) и замены .

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

11.4Выводы

Фазовые портреты нелинейных систем на плоскости можно исследовать, переходя к линеаризации. Для этого надо вычислить матрицу Якоби правой части системы в особой точке — она и будет матрицей линеаризованной системы. Если линеаризация имеет особую точку типа узел, фокус или седло, фазовый портрет исходной (нелинейной) системы в окрестности особой точки похож на фазовый портрет линеаризации. Для центров это неверно: центры по линейным членам могут выглядеть как фокусы. К особым точкам с вырожденной матрицей линеаризации этот метод неприменим.

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