Делает ли это то, что вы хотите?
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.
Есть еще несколько вещей, которые я хотел бы сказать, но я ухожувремени.Я сделаю еще одну правку через несколько часов.