2012-01-14 4 views
2

Мне нужна помощь. У меня много переменных, которые я использую в моей команде 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}}]}] 

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

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, вы увидите то, что я хочу. Благодарим вас за любые предложения.

ответ

7

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

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

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

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

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

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

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

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

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

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"}] 
+0

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

+0

Я не просмотрел подробно, но, похоже, есть небольшая ошибка. Ползунок «Длина» не останавливается на '10/n'. Если вы пройдете мимо него, он вернется к 0,0001. Точно так же, если вы увеличите ползунок «Преломление» так, чтобы длина> '10/n', тогда длина вернется к 0, но ползунок свободен для перемещения. Я знаю физику и почему это происходит, но лучше было бы, если бы ползунок остановился, вместо того, чтобы свободно переключаться/перемещаться. В любом случае, добро пожаловать в «Переполнение стека» и спасибо за то, что он принял предложение :) – abcd

+0

Спасибо, что указали это, Йода, и спасибо за теплый прием. Я немного скорректировал код. –

5

Я думаю, что ваша первая партия кода выглядит хорошо и легко помещается в 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"}] 
+0

Спасибо, вы решить мою проблему. Манипуляция действительно мощная. – balboa

Смежные вопросы