Нужна помощь в решении дифференциального уравнения и построении графика зависимости скорости от величины члена - PullRequest
2 голосов
/ 16 мая 2011

Мне нужна была помощь в построении диаграммы зависимости скорости от форсированного члена для хаотического осциллятора на mathematica.

По сути, я должен решить следующее дифференциальное уравнение

x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0, x'[0] == 0, 
 x[0] == 0

и нанесите на график скорость моего решения для времен в интервале [0,1000] с шагом 2 * Пи для разных значений f.

То есть для каждого f в интервале [0,2] (с шагом 0,05) у меня будет приблизительно 150 точек скорости, и я должен построить все эти точки на одном графике.

Я подумал об использовании цикла do и придумал что-то вроде

Remove["Global`*"]

b = .1;
w = 1;
Period = 1;
tstep = 2 Pi/Period;

Do[{Do[{data = 
     Table[Flatten[
       Evaluate[{f, 
         x'[t] /. 
          NDSolve[{x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0,
             x'[0] == 0, x[0] == 0}, x[t], {t, 0, 1000}, 
           MaxSteps -> 59999]}]], {t, 0, 1000, tstep}]}, {t, 0, 1000, 
    1}]}, {f, 0, 2, .1}]

но не повезло.

Как я могу это сделать?

1 Ответ

2 голосов
/ 16 мая 2011

Делает ли это то, что вы хотите?

b = .1;
w = 1;

sol := {f, 
  NDSolve[{x''[t] + b x'[t] - x[t] + x[t]^3 - f Cos[w t] == 0, 
     x'[0] == 0, x[0] == 0}, x[t], {t, 0, 1000}, MaxSteps -> 59999][[1, 1, 2]]}

interpsols = Table[sol, {f, 0, 2, 0.1}];

ListPlot[Table[interpsols, {t, 0, 1000, 2 Pi}]]

Объяснение

Сначала позвольте мне сосредоточиться на sol.Это близко к вашему собственному коду (с изменением), но реорганизовано для ясности, а не скрыто внутри циклов.

  • sol := эквивалентно SetDelayed[sol, ...
  • Это вернонедооцененное определение, которое дано справа
  • Поэтому операция NDSolve не выполняется до тех пор, пока sol не используется где-то

Сделанное мной изменение былочтобы извлечь эту часть из результата NDSolve:

InterpolatingFunction[{{0.,1000.}},<>][t]

Я делаю это с Part: NDSolve[...][[1, 1, 2]]

Это также можно сделать с помощью x[t] /. First @ NDSolve[...]

Эта извлеченная часть в паре с текущим значением f в списке: {f, NDSolve[ ... }, так что позже они могут быть построены.

Теперь:

interpsols = Table[sol, {f, 0, 2, 0.1}];

создаеттаблица изменяющегося значения sol, поскольку оно глобально изменяет значение f.Здесь выполняется NDSolve.

Результатом является ряд решений для каждого значения f в этой форме:

{{0.,InterpolatingFunction[{{0.,1000.}},<>][t]},
 {0.1,InterpolatingFunction[{{0.,1000.}},<>][t]},
 {0.2,InterpolatingFunction[{{0.,1000.}},<>][t]},
 {0.3,InterpolatingFunction[{{0.,1000.}},<>][t]},
 {0.4,InterpolatingFunction[{{0.,1000.}},<>][t]}
 ...

Наконец:

ListPlot[Table[interpsols, {t, 0, 1000, 2 Pi}]]

создает таблицу, оценивая всю серию результатов, созданных выше, для глобально изменяющихся значений t и ListPlot s.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...