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

Я думаю, что это - намного лучший метод (в VB, не должно быть твердо перевести):

, Учитывая XElement x:

Dim xReader = x.CreateReader
xReader.MoveToContent
xReader.ReadInnerXml
6
задан Dr. belisarius 12 September 2010 в 16:15
поделиться

2 ответа

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

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} 

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


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

Например,

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; в противном случае все будет ужасно прыгать, когда значение a изменится. Когда вы выполняете более сложные задачи с помощью Manipulate, есть несколько вариантов управления скоростью обновлений, которые могут быть важны, если ваша ODE достаточно сложна и требует времени для решения.

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


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

Например,

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; в противном случае все будет ужасно прыгать, когда значение a изменится. Когда вы выполняете более сложные задачи с помощью Manipulate, существует ряд опций для управления скоростью обновлений, что может быть важно, если ваша ODE достаточно сложна и требует времени для решения.

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


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

Например,

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; в противном случае все будет ужасно прыгать, когда значение a изменится. Когда вы выполняете более сложные задачи с помощью Manipulate, существует ряд опций для управления скоростью обновлений, что может быть важно, если ваша ODE достаточно сложна и требует времени для решения.

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

Например,

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 оставалась неизменной; в противном случае все будет ужасно прыгать, когда значение a изменится. Когда вы выполняете более сложные задачи с помощью Manipulate, существует ряд опций для управления скоростью обновлений, что может быть важно, если ваша ODE достаточно сложна и требует времени для решения.

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

Например,

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; в противном случае все будет ужасно прыгать, когда значение a изменится. Когда вы выполняете более сложные задачи с помощью Manipulate, существует ряд опций для управления скоростью обновлений, что может быть важно, если ваша ODE достаточно сложна и требует времени для решения.

8
ответ дан 10 December 2019 в 00:41
поделиться

Между тем, я нашел другой способ сделать это. Он менее элегантен, но в нем используется только одна подстановка, поэтому я решил разместить его и здесь.

Идея состоит в том, чтобы использовать Hold на Plot , чтобы он не работал. Чтобы не получить оценку, выполните замену правила, а затем ReleaseHold , непосредственно перед Manipulate .

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}]
2
ответ дан 10 December 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: