Обыкновенные дифференциальные уравнения

Дифференциальные уравнения – это язык физики

Версия для печати

Нелинейная динамика и хаос

За последние 40 лет применение компьютеров возродило старую и тяжелую задачу классической механики. Все началось с системы трех связанных ДУ, придуманных Эдом Лоренцом (Ed Lorentz) при попытках моделирования погоды.

  • restart;with(plots):
  • Eq1:=diff(x(t),t) = sigma*(y(t)-x(t));
  • Eq2:=diff(y(t),t) = r*x(t)-y(t)-x(t)*z(t);
  • Eq3:=diff(z(t),t) = x(t)*y(t)-b*z(t);

где константы σ, r, b можно выбирать как хочется. В большинстве случаев выбор параметров не давал ничего интересного, но Лоренц открыл, что есть диапазон параметров, в котором решения ведут себя очень странно. Если выберем

  • sigma:=10;b:=8/3;

и будем менять r от 0 до ~30, происходит переход от скучного ординарного поведения к странному, которое революционизировало много областей науки, в том числе физику.

Для численного решения этого набора ДУ с особым выбором r применим:

  • r:=10;s:=dsolve({Eq1,Eq2,Eq3,x(0)=1,y(0)=1,z(0)=1},
    {x(t),y(t),z(t)},type=numeric);

и с помощью odeplot посмотрим, как выглядит решение:

  • odeplot(s,[[t,x(t)],[t,y(t)],[t,z(t)]],0..30,numpoints=600);

Запустим группу для значений r: 10, 20, 28, 35, 45. При r выше ≈ 25 колебания создают рисунок с не повторяющейся структурой. (Запустите odeplot на более долгое время, чтобы отсортировать колебания.) А вот что совсем плохо: если взять чуть другие начальные условия, получается совсем иная картинка (это знаменитый эффект бабочки. Чтобы его увидеть, возьмите r = 50 и сравните результаты при начальных условиях x(0) = 1.0 и x(0) = 1.0000001, обращая особое внимание на то, как выглядят зеленый и красный следы вблизи t = 30). Это совсем неожиданно. Управляющие этим поведением уравнения полностью определены и достаточно просты. Как может из простой вещи появиться случайный выброс? Это явно удивительно, и такое поведение называется динамическим хаосом.

Другой способ. Вместо графика x(t) рисуем с помощью команды графики spacecurve трехмерную траекторию кривой решения [x(t), y(t), z(t)]. Для этого делается цикл повторяющихся вызовов dsolve, создающих последовательность трехмерных графиков вдоль траектории системы. В spacecurve передается последовательность точек, как в примере ниже.

Зададим для r0 начальные значения (x, y, z), начальное время t1, конечное время t2 и число точек вдоль траектории numpoints, затем вычислим шаг по времени между двумя последовательными точками:

  • r0:=[1,1,1];t1:=0;t2:=10;numpoints:=400;
    dt:=(t2-t1)/numpoints;

Зададим параметр системы r:

  • r:=50;

Шаг системы включает повторяющиеся вызовы dsolve, каждый из которых своим начальным условием имеет конечное условие предыдущего шага. Это сделано циклом for-do-enddo (см. главу Программирование). Учтите, что вычисления длительные и придется ждать.

  • for i from 1 to numpoints do
  • s:=dsolve({Eq1,Eq2,Eq3,x(0)=r0[1],y(0)=r0[2],z(0)=r0[3]},
    {x(t),y(t),z(t)},type=numeric):
  • t0:=t1+(i-1)*dt:
  • tf:=t0+dt:
  • sol:=s(tf-t0):

После каждого шага сохраним (x, y, z) в rf[i]:

  • rf[i]:=[rhs(op(2,sol)),rhs(op(3,sol)),rhs(op(4,sol))]:

Получим следующее начальное условие:

  • r0:=rf[i]:

Окончание цикла, возврат назад и повторное исполнение:

  • enddo:

Поставим rf в последовательность, чтобы использовать со spacecurve:

  • L:=[seq(rf[i],i=1..numpoints)]:

Построим траекторию:

  • spacecurve(L,orientation=[45,60]);

Можно поставить курсор и покрутить график или анимировать вращение в цикле.

Сделаем 100 пространственных кривых, каждую с немного другим углом обзора. Затем анимируем эту последовательность так, что траектория поворачивается на экране, облегчая ее рассмотрение в 3D-:

  • for i from 1 to 100 do
  • theta :=45:phi:=i*3.6:
  • p[i]:=spacecurve(L,orientation=[theta,phi]):
  • od:

Нарисуем анимацию.

Когда появится картинка, щелкните по ней, чтобы возникли элементы управления анимацией на панели управления:

  • plots[display]([seq(p[i],i=1..100)],insequence=true);

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