#wolfram-mathematica
#wolfram-mathematica
Вопрос:
Изначально я пытался визуализировать функцию с 4 параметрами с помощью Plot3D и манипулировать ползунками (с двумя параметрами, управляемыми ползунками, а другие изменяются в плоскости «x-y»). Однако я не получаю никаких выходных данных, когда мои параметры, не отображаемые на графике, управляются с помощью Manipulate?
Следующий пример одномерного графика воспроизводит то, что я вижу в более сложной попытке построения графика:
Clear[g, mu]
g[ x_] = (x Sin[mu])^2
Manipulate[ Plot[ g[x], {x, -10, 10}], {{mu, 1}, 0, 2 [Pi]}]
Plot[ g[x] /. mu -> 1, {x, -10, 10}]
График с фиксированным значением mu имеет ожидаемый параболический выходной сигнал в автоматически выбранном диапазоне {0,70}, тогда как график Manipulate пуст в диапазоне {0, 1}.
Я подозревал, что график не был выбран с хорошими значениями по умолчанию при использовании ползункового управления mu, но добавление графика вручную также не показывает выходных данных:
Manipulate[ Plot[ g[x], {x, -10, 10}, PlotRange -> {0, 70}], {{mu, 1}, 0, 2 [Pi]}]
Ответ №1:
Это связано с тем, что Manipulate
параметры являются локальными.
mu
In Manipulate[ Plot[ g[x], {x, -10, 10}], {{mu, 1}, 0, 2 [Pi]}]
отличается от глобального mu
, который вы очистили в предыдущей строке.
Я предлагаю использовать
g[x_, mu_] := (x Sin[mu])^2
Manipulate[Plot[g[x, mu], {x, -10, 10}], {{mu, 1}, 0, 2 [Pi]}]
Следующее тоже работает, но оно продолжает изменять значение глобальной переменной, что может вызвать сюрпризы позже, если вы не обратите внимания, поэтому я не рекомендую это:
g[x_] := (x Sin[mu])^2
Manipulate[
mu = mu2;
Plot[g[x], {x, -10, 10}],
{{mu2, 1}, 0, 2 [Pi]}
]
Может случиться так, что вы Clear[mu]
, но обнаружите, что он получает значение в тот момент, когда объект Manipulate прокручивается в поле зрения.
Комментарии:
1. спасибо, это работает хорошо и обобщено на график с четырьмя параметрами, который я действительно пытался.
Ответ №2:
Другой способ преодолеть Manipulate
локализацию — перенести функцию в Manipulate[]
:
Manipulate[Module[{x,g},
g[x_]=(x Sin[mu])^2;
Plot[g[x], {x, -10, 10}]], {{mu, 1}, 0, 2 [Pi]}]
или даже
Manipulate[Module[{x,g},
g=(x Sin[mu])^2;
Plot[g, {x, -10, 10}]], {{mu, 1}, 0, 2 [Pi]}]
Оба из которых дают
Module[{x,g},...]
предотвращает нежелательные побочные эффекты из глобального контекста. Это позволяет получить простое определение g: у меня были Manipulate[]
отредактированные графики с десятками настраиваемых параметров, которые могут быть громоздкими при передаче всех этих параметров в качестве аргументов функции.