调整mathematica中的操作输出

bal*_*boa 2 wolfram-mathematica

我需要帮助.我有很多变量,我在我的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}}]}]
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案之一,但它真的很混乱.我所做的只是手动插入这些值.有没有更合适的方法来实现这个:

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"}]
Run Code Online (Sandbox Code Playgroud)

以及如何使我的图形不要经常改变它的大小.我希望棱镜有固定的尺寸和入射光线来改变它的位置(当我在上面的例子中得到> 6.66时这种情况发生了/这个解决方案).

问题可能令人困惑,但如果你在Mathematica中尝试它,你会看到我想要的东西.谢谢你的任何建议.

Vit*_*rov 7

我认为你的解决方案一般都不错,马克已在他的回复中注意到了.我也很喜欢Mark的解决方案.仅仅为了实验,我也分享了我的想法.

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演示项目提交演示,这些要点将非常重要.如果你只是在玩 - 我认为你和Mark的解决方案非常好.

谢谢,Vitaliy

 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"}]
Run Code Online (Sandbox Code Playgroud)


Mar*_*ure 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"}]
Run Code Online (Sandbox Code Playgroud)