настройка манипулирования выводом в Mathematica - PullRequest
2 голосов
/ 14 января 2012

Мне нужна помощь.У меня есть много переменных, которые я использую в своей команде Graphics[], которые зависят от одной переменной (в моем примере H).Я хочу манипулировать моей графикой так, чтобы при изменении значения H графика менялась соответственно.Но это не так просто, как я думал.

Если вы знаете, как это сделать, я был бы признателен.

 (*This variables are dependent on H that I want to change in
manipulate*)

R = 10;

\[Alpha] = ArcSin[H/R];

p = H/Tan[\[Alpha]];

n = 1.5;

\[Beta] = ArcSin[n Sin[\[Alpha]]];

\[Theta] = \[Beta] - \[Alpha];

l = H/Tan[\[Theta]];

(*This is the graphic I want to make manipulated*)

Graphics[{(*Incident ray*)Line[{{-2, H}, {p, H}}],(*Prism*)
  Circle[{0, 0}, R, {0, Pi/2}], 
  Line[{{0, 0}, {0, 10}}],(*Refracted ray*)
  Line[{{p, H}, {p + l, 0}}],(*Surface*)
  Line[{{0, 0}, {p + l + 10, 0}}]}]

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

R = 10;
n = 1.5;
Manipulate[
 Graphics[{(*Incident ray*)
   Line[{{-2, H}, {H/Tan[ArcSin[H/10]], H}}],(*Prism*)
   Circle[{0, 0}, R, {0, Pi/2}], 
   Line[{{0, 0}, {0, 10}}],(*Refracted ray*)
   Line[{{H/Tan[ArcSin[H/10]], 
      H}, {H/Tan[ArcSin[H/10]] + 
       H/Tan[ArcSin[n Sin[ArcSin[H/10]]] - ArcSin[H/10]], 
      0}}],(*Surface*)
   Line[{{0, 
      0}, {H/Tan[ArcSin[H/10]] + 
       H/Tan[ArcSin[n Sin[ArcSin[H/10]]] - ArcSin[H/10]] + 10, 
      0}}]}], {H, 0.0001, 10, Appearance -> "Labeled"}]

А также как заставить мою графику не изменять ее размер постоянно.Я хочу, чтобы призма имела фиксированный размер, а падающий луч менял ее положение (как это происходит, когда H в моем примере выше / 6,66 / это решение).

Возможно, вопрос запутанный, но если вы попытаетесь вMathematica, вы увидите, что я хочу.Спасибо за любые предложения.

Ответы [ 2 ]

7 голосов
/ 14 января 2012

Я думаю, что ваше решение в целом неплохое, Марк уже заметил в своем ответе. Мне тоже понравилась простота решения Марка. Ради эксперимента я тоже делюсь своими идеями.

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

2) В этом конкретном случае, если вы пытаетесь прочитать дополнительные переменные, вставляя выражения одно в другое, ваши уравнения усложняются, и трудно понять, почему они иногда терпели неудачу. Немного алгебры с помощью функций TrigExpand и FullSimplify может помочь прояснить, что ваша переменная H имеет ограничения в зависимости от значения n показателя преломления (см. Ниже).

3) Если нам известна точка (2), мы также можем сделать переменную n динамической и связать значение H с n (сброс верхней границы H) прямо в определении элементов управления, поэтому всегда должно быть H <10 / п. Если [..] также необходимо, чтобы элементы управления не были «розовыми». </p>

4) Если ваши формулы будут зависеть от R, мы также можем сделать R динамическим. Но у меня нет этой информации, поэтому я локализовал R через концепцию «фиктивного» элемента управления (ControlType -> None), что является весьма полезным понятием для Manipulate.

5) Используйте PlotRange и ImageSize, чтобы остановить покачивание графики

6) Сделай это красиво; -)

Эти пункты будут важны, если вы хотите, например, подать Демонстрацию в Демонстрационный проект Вольфрама. Если вы просто играете - я думаю, что ваши решения и решения Марка очень хорошие.

Спасибо, Виталий

 Manipulate[If[H >= 10/n, H = 10/n - .0001]; Graphics[{
   {Red, Thick, Line[{{-2, H}, {Sqrt[100 - H^2], H}}]},
   {Blue, Opacity[.5], Disk[{0, 0}, R, {0, Pi/2}]},
   {Red, Thick, Line[{{Sqrt[100 - H^2], H}, 
    {(100 n)/(Sqrt[100 - H^2] n - Sqrt[100 - H^2 n^2]), 0}}]}},
  Axes -> True, PlotRange -> {{0, 30}, {0, 10}}, 
  ImageSize -> {600, 200}], {{R, 10}, ControlType -> None},
 {{n, 1.5, "Refraction"}, 1.001, 2, Appearance -> "Labeled"},
 {{H, 3, "Length"}, 0.0001, 10/n - .0001, Appearance -> "Labeled"}]
5 голосов
/ 14 января 2012

Я думаю, что ваша первая партия кода выглядит хорошо и ее легко поместить в Manipulate.Я бы порекомендовал использовать опцию PlotRange в Graphics.

R = 10;
n = 1.5;
Manipulate[
  \[Alpha] = ArcSin[H/R];
  p = H/Tan[\[Alpha]];
  \[Beta] = ArcSin[n Sin[\[Alpha]]];
  \[Theta] = \[Beta] - \[Alpha];
  l = H/Tan[\[Theta]];
  Graphics[{
    Line[{{-2, H}, {p, H}}],(*Prism*)
    Circle[{0, 0}, R, {0, Pi/2}], 
    Line[{{0, 0}, {0, 10}}],(*Refracted ray*)
    Line[{{p, H}, {p + l, 0}}],(*Surface*)
    Line[{{0, 0}, {p + l + 10, 0}}]},
    PlotRange -> {{-1,33},{-1,11}}],
  {H,0.0001,6,Appearance->"Labeled"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...