2012-01-14 34 views
2

我需要幫助。我有很多變量,我在我的Graphics[]命令中使用,這些變量依賴於一個變量(在我的示例中爲H)。我想操作我的圖形,以便通過相應地更改H圖形更改的值。但這並不像我想象的那麼容易。在mathematica中調整操作輸出

如果您對如何實現這一點有任何想法,我將不勝感激。

(*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)爲特定的Manipulate定位變量總是一件好事,所以它們的值不會泄漏並干擾其他動態內容。如果您在筆記本中有額外的計算,這很重要 - 它們可能會開始重置對方。

2)在這種特殊情況下,如果您試圖讀取額外的變量,將表達式相互關聯,您的方程就變得複雜了,很難看出它們爲什麼會失敗一些。在函數TrigExpand和FullSimplify的幫助下,一些代數可能有助於闡明變量H取決於折射率指數值n(見下文)的限制。 3)如果我們知道點(2),我們也可以使變量n動態化,並且在控件定義中將值H連接到n(重置H的上界),所以總是應該是H < 10/n。如果[..]也是必要的,所以控件不會「粉紅色」。

4)如果你的公式取決於R,我們也可以使R是動態的。但是我沒有這些信息,所以我通過「虛擬」控制(ControlType - > None)的概念來定位R,這對於Manipulate來說非常有用。

5)使用PlotRange和IMAGESIZE停止圖形輕搖

6)使它美麗;-)

這點很重要,如果你願意,例如,提交示範Wolfram示範項目。如果你只是在玩耍 - 我認爲你和馬克的解決方案非常好。

感謝, 維塔利

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

順便說一句,我從你的代碼中移除了幾條固定的行 - 很容易把它們放回去。 – 2012-01-14 18:47:27

+0

我沒有仔細看過,但似乎有一個小錯誤。 「長度」滑塊不會停在'10/n'處。如果你經過它,它會回落到0.0001。同樣,如果增加「折射」滑塊以使長度> 10/n,則長度回到0,但滑塊可自由移動。我知道它的物理原理以及它爲什麼會發生,但是如果滑塊停止,可能會更好,而不是自動重置/移動。在任何情況下,歡迎堆棧溢出,並感謝提交的建議:) – abcd 2012-01-14 20:07:30

+0

感謝您指出了這一點,尤達和感謝的熱烈歡迎。我調整了一下代碼。 – 2012-01-14 20:31:44

5

我認爲你的第一批代碼看起來很好,很容易放入Manipulate。我會建議在Graphics中使用PlotRange選項。

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 2012-01-14 18:08:05