2012-01-14 145 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