【问题标题】:How to define parameter values graphically, under constraints?如何在约束下以图形方式定义参数值?
【发布时间】:2011-10-23 17:17:15
【问题描述】:

我正在尝试弄清楚是否可以实现以下 Mathematica 接口。

我想在 Mathematica 中创建一个界面,用户可以在此界面中以图形方式和交互方式定义任意数量的数值参数,但要受到约束。

问题中的参数是数字权重[0,1],每个都与相应的标准相关联,并限制为总和为一个。显然,这种约束会导致对与每个标准相关联的权重进行权衡,我想通过沿以下内容的交互式绘图(不幸的是,在 Excel 中制作)以图形方式使这种权衡变​​得明显:

在本例中,有 6 个标准,但我想将其推广到任意数字(例如 2 到 7 之间)。

界面将通过沿相应轴拖动每个多边形顶点(对应于特定权重)并让其他顶点均匀调整以使其总和为 1 来工作。

然后将返回数值以用于后续计算。

我环顾四周,似乎找不到遇到同样问题的人(搜索查询的定义可能很重要)。

我在 Mathematica 的示例中找到的最接近的是定位器窗格的以下应用,其中允许在正方形上移动 3 个点并返回它们的位置:

DynamicModule[{pt = {{1, 1}/2, {-1, 1}/2, {1, -1}/2}}, {LocatorPane[ Dynamic[pt], Graphics[{Gray, Disk[]}]], Dynamic[pt]}]

【问题讨论】:

  • 请注意 Dynamic[] 及其朋友很难驯服。我不建议开始使用它们来学习 Mma。
  • 指出,谢谢! ;-) 实际上,我正在尝试逐步建立,但我需要确保这个特定的界面可以在 Mathematica 中完成,因为我正在考虑移植我在 MMA 中编写的整个软件,这是它的重要组成部分.
  • 记住你可以使用其他语言

标签: wolfram-mathematica interactive


【解决方案1】:

大概是这样的:

n = 6;
posText[x_List] := Text[Round[Norm@#/Total@(Norm /@ x), .01], 1.3 #, 
                        Background -> LightRed] & /@ x;
rot = RotationMatrix[Pi/15];
DynamicModule[{
  pt = pti = {Re@#, Im@#} &@(E^(2 I Pi #/n)) & /@ Range@n,
  r  = Array[1 &, n]},
 Column@{LocatorPane[
    Dynamic[pt],
    Framed@Graphics[
      {(*The Arrows*)
       Black, Arrow[{{0, 0}, 1.2 #}] & /@ pt,

       (*The Criteria Numbers*)
       MapIndexed[{Text[Style[#2[[1]],20], #1],Circle[#1,.1]}&, 1.1 rot.#&/@pti],

       (*The Cyan Polygons*)
       FaceForm[None], EdgeForm[Cyan], Polygon[pt #] & /@ Range[.2, 1, .2],

       (*The Points*)
       Black, Dynamic[Point[r = MapThread[#1 Clip[#1.#2, {0, 1}] &, {pti, pt}]]],

       (*The Text legends*)
       Dynamic[posText@ r],

       (*The Red Polygon*)
       EdgeForm[{Red, Thick}], Dynamic[Polygon@r]},

      ImageSize -> 550, PlotRange ->1.5 {{-1, 1}, {-1, 1}}], 
    Appearance -> None],
   (*The Footer*)
   Dynamic[Grid[{Table[Norm@r[[i]], {i, n}]}/Total@(Norm /@ r), Dividers->All]]}]

【讨论】:

  • 谢谢!差不多好了!它以数值方式工作,因为在重新缩放多边形时结果确实总和为 1。但是,红色多边形的实际大小是不受约束的,可以任意小。我希望通过在移动每个顶点时统一重新缩放每个顶点来以图形方式进行权衡。此外,每个权重的初始(图形)大小应为 1/n(在本例中为 1/6)。
  • @MatteoS 当你只改变一个点时,所有点都移动是非常令人不安的。我更喜欢这种界面,您可以通过相对(相对于绝对)更改向量值来设置值。
  • @Mr.顺便说一句,我相信一个优秀的程序员必须有完美主义病毒进入他的血管。通过在 N 次编辑后将答案转换为 CW 来惩罚完美主义是(我认为)这里最愚蠢的规则。
  • 很好,但我只是想让你再做一次编辑。 ;-) youtube.com/watch?v=UI1zKC02IoI
  • @belisarius Mods 可以移除 CW。 CW for 10 编辑规则已经到位,因为人们不断重复编辑以将其推到首页并因此获得更多选票。鉴于您在此处进行的大部分编辑都是大量的,在原始发布后的几个小时内 并且 mathematica 是一个不会出现在大多数人的首页上的小标签,我认为您可以尝试询问版主审查您的案件。你可能想用一个标志来解释它。
【解决方案2】:

可能是这样的

Manipulate[
 DynamicModule[{mags, pts, bkgrnd, corners},
  corners = N@Table[{Sin[2 Pi i/n], Cos[2 Pi i/n]}, {i, n}];
  mags = N@Table[1/n, {n}];
  pts = mags corners;
  bkgrnd = {{FaceForm[Opacity[0]], EdgeForm[Gray], 
     Polygon[ Table[r corners, {r, .2, 1, .2}]]},
    Table[
     Text[Row[{"Criterion ", i}], 
      1.05 corners[[i]], -corners[[i]]], {i, n}]};

  LocatorPane[
   Dynamic[
    pts, (mags = Norm /@ #; mags = mags/Total[mags]; 
      pts = mags corners) &],
   Dynamic@Graphics[{bkgrnd,
      {FaceForm[], EdgeForm[{Thick, Blue}], Polygon[pts]},
      Table[
       Text[NumberForm[mags[[i]], {4, 2}], 
        pts[[i]], -1.8 corners[[i]]], {i, n}]}, PlotRange -> All],
   Appearance -> Graphics[{PointSize[.02], Point[{0, 0}]}]]],

 {{n, 3}, Range[3, 7]}]

截图:

【讨论】:

  • 当然不是你的错,但我发现这种用户界面几乎无法使用。
  • 当你移动一个点时,其余的就会缩小。例如,尝试移动一个点,然后通过移动它们再次将它们设置为相等。
  • 我必须说,这两个答案都给我留下了深刻的印象,但这个答案准确地传达了我心中的图形权衡。干得好,谢谢你们俩!关于@belisarius 的评论,我明白他的意思,但能否通过一个“重置”按钮将所有权重设置为 1/n 来解决这个难题?
  • 当然,在这种情况下,当条件的数量增加时,交互式多边形的默认大小会变得相对较小,并且在 1/n 左右的值的微小变化很难实现。也许可以将轴的刻度设置为对数刻度来解决这个问题,你怎么看?
  • @MateoS 所以尝试将两个权重设置为其余权重的两倍
猜你喜欢
  • 2015-01-10
  • 2019-08-29
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多