Мои коллеги правы, но я думаю, что можно сказать еще кое-что. Во-первых, к вашему актуальному вопросу. Вывод NDSolve
представляет собой список вида
{{x[t]->InterpolatingFunction[...]}, {x[t]->InterpolatingFunction[...]}, ...}
, где второе и последующие правила замены существуют только при наличии более одного решения. Я никогда не сталкивался с делом, использующим NDSolve
, где это правда, но это делает ответ совместимым с Solve
, где множество решений не является редкостью. Поэтому, имея только одно решение, вы получаете двойной список, то есть
{{x[t]->InterpolatingFunction[...]}}
Согласно Мистер. Мастер , вы можете использовать First
, или вы можете использовать Part
, т.е.
NDSolve[ ... ][[ 1 ]]
- это мой предпочтительный метод, хотя его немного сложнее читать и он может затенить ваши намерения. Вы должны знать, что InterpolatingFunction
, который возвращает NDSolve
, является функцией, и она будет принимать переменные напрямую. Итак, переменные в левой части объявлений
x[t_] = x[t] /. s
и от Велизарий
xr[u_] := ((x[t] /. s[[1]]) /. t -> u)
в лучшем случае являются излишними, а второй требует замены каждый раз, когда используется xr
. Вместо этого вы можете объявить
x = x[t] /. s
, а затем запись x[t]
впоследствии вернет IntepolatingFunction[t]
, именно так, как вы хотите. Затем, как указывает Велизарий , вы можете использовать его или его производную непосредственно в Plot
вместо того, чтобы сначала строить таблицу значений и вводить их в ListPlot
.
Редактировать : когда я впервые опубликовал это, я не заметил причуды с NDSolve
. Если вы явно решите для x[t]
, а не x
, то NDSolve
вернет InterpolatingFunction[...][t]
, но если вы просто решите для x
, вы получите то, что я написал. Эта особенность позволяет использовать решения как ОП, так и Велизария, иначе замена не должна произойти.