Использование решения дифференциального уравнения в двух отдельных командах сюжета в Mathematica

StackOverflow https://stackoverflow.com/questions/1327789

Вопрос

Я столкнулся с проблемой, пытаясь использовать ответ из Ndsolv В двух отдельных командах сюжета. Чтобы проиллюстрировать проблему, я использую простое дифференциальное уравнение и только одну команду сюжета. Если я напишу что -то вроде этого:

{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]

Он решает уравнение и рассчитывает x [4] без проблем, но сюжет становится пустым, и я понятия не имею, почему.

В моей реальной проблеме мое уравнение является довольно сложной системой для нескольких функций, и вместо x [4 Я нарисую параметрический график решенных функций. В конечном итоге я намерен включить все это в Манипулировать заявление, поэтому я не хочу Ndsolv Заявление, чтобы появиться более одного раза (занимает слишком много времени), и я не могу просто рассчитать его заранее (так как у него много параметров).


РЕДАКТИРОВАТЬ: Я хотел бы уточнить и расширить свой вопрос: что я на самом деле хочу сделать, это включить мое заявление о заговоре в Манипулировать заявление следующим образом:

Manipulate[{Plot[x[t], {t, 0, 10}], x[4]} 
/. NDSolve[{x'[s] == - a*x[s], x[0] == 1}, x, {s, 0, 10}]
,{{a,1},0,5}]

Поскольку только Манипулировать оператор придает значение параметру а, Я не могу рассчитать ответ на Ndsolv заранее. Кроме того, поскольку моя реальная система уравнения очень сложная и нелинейная, я не могу использовать символическую функцию DSOLE.

Извините, если раньше это было неясно.

Это было полезно?

Решение

Ваша проблема заключается в том, что сюжет [] делает несколько забавных вещей, чтобы сделать сюжет более удобным, и одна из вещей, которые он делает, - это просто не сюжет, что он не может оценить численно. Итак, в выражении, которое вы опубликовали,

Plot[x[t], {t, 0, 10}]

просто идет вперед и оценивает до выполняя замену правила решением из NDSOLVE, создавая графический объект пустого графика. Этот графический объект не содержит ссылки на X, поэтому заменить нечего.

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

sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}];
{Plot[Evaluate[x[t] /. sol], {t, 0, 10}], x[4] /. sol} 

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


Чтобы сделать эту работу в манипулировании, простым способом является использование с [], которая является одной из баллов математики; Это тот, где вы просто хотите что -то заменить, не используя его в качестве переменной, которую вы можете мутировать.

Например,

Manipulate[
  With[{sol = NDSolve[{x'[s] == - x[s], x[0] == 1}, x, {s, 0, 10}]},
    {Plot[x[t] /. sol // Evaluate, {t, 0, 10}, PlotRange -> {0, 1}], 
     x[4] /. sol}],
  {{a, 1}, {0, 5}}]

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

Другие советы

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

Идея состоит в том, чтобы использовать Держать на Сюжет Так что это не будет оцениваться, заменить правило, а затем Выпуск, как раз перед Манипулировать.

Manipulate[ReleaseHold[
  Hold[ {Plot[x[t], {t, 0, 10}, PlotRange -> {0, 1}], x[4]} ]
 /.NDSolve[{x'[s] == -a x[s], x[0] == 1}, x, {s, 0, 10}]
], {{a, 1}, 0, 5}]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top