Wolfram mathematica 如何在约束条件下以图形方式定义参数值?

Wolfram mathematica 如何在约束条件下以图形方式定义参数值?,wolfram-mathematica,interactive,Wolfram Mathematica,Interactive,我试图弄清楚是否有可能实现以下Mathematica接口 我想在Mathematica中创建一个界面,用户可以根据约束以图形和交互方式定义任意数量的数值参数 问题中的参数是数值权重[0,1],每个参数都与相应的标准关联,并限制为求和为一。很明显,这个约束导致了与每个标准相关联的权重的权衡,我想通过以下的交互绘图(不幸的是,在Excel中制作)使这种权衡以图形方式表现出来: 在本例中,有6个标准,但我想将其推广到任意数字(例如,介于2和7之间) 通过沿相应轴拖动每个多边形顶点(对应于特定权重),

我试图弄清楚是否有可能实现以下Mathematica接口

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

问题中的参数是数值权重
[0,1]
,每个参数都与相应的标准关联,并限制为求和为一。很明显,这个约束导致了与每个标准相关联的权重的权衡,我想通过以下的交互绘图(不幸的是,在Excel中制作)使这种权衡以图形方式表现出来:

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

通过沿相应轴拖动每个多边形顶点(对应于特定权重),并使其他顶点均匀调整,使其总和始终为1,该界面将起作用

然后返回数值,用于后续计算

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

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

DynamicModule[{pt={{1,1}/2,{-1,1}/2,{1,-1}/2},{LocatorPane[
动态[pt],图形[{灰色,磁盘[]}]],动态[pt]}]


可能是这样的:

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]]}]


可能是这样的

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]}]
截图:


谢谢!快到了!它在数值上起作用,在重新缩放多边形时,结果的总和确实为1。但是,红色多边形的实际大小是不受限制的,可以任意变小。我希望通过让每个顶点在移动时都均匀地重新缩放,以图形的方式显示折衷。此外,每个重量的初始(图形)大小应为1/n(本例中为1/6)。@MatteoS在仅更改一个重量时,所有点都要移动,这非常令人不安。我更喜欢这种界面,通过相对(而非绝对)改变向量值来设置值。@顺便说一句,我相信一个好的程序员一定有完美主义病毒侵入他的血管。在N次编辑后将答案转换为CW来惩罚完美主义(我认为)是这里最愚蠢的规则。那很好,但我只是想让你再做一次编辑。;-)@belisarius Mods可以移除CW。CW的10次编辑规则之所以成立,是因为人们不断地重复编辑,以使其登上头版,从而获得更多的选票。考虑到你在这里所做的大部分编辑都是实质性的,在最初发布的几个小时内,mathematica是一个小标签,不会出现在大多数人的头版,我想你可以试着请一位版主来审查你的案例。你可能想用一个标志来解释它。当然,这不是你的错,但我发现这种用户界面几乎不可能使用。当你移动一个点时,其他点就会收缩。例如,试着移动一个点,然后通过移动它们使所有点再次相等。我必须说,这两个答案都给我留下了深刻的印象,但这一个正好传达了我心目中的图形权衡。干得好,谢谢你们两位!关于@belisarius的评论,我明白他的意思,但这个困难是否可以通过一个将所有权重设置为1/n的“重置”按钮来解决?当然,在这种情况下,当标准数量增加时,交互式多边形的默认大小相对较小,并且在1/n左右的值中进行较小的更改很难实现。也许可以将轴的比例设置为对数比例来解决这个问题,你觉得如何?@MateoS因此,尝试将两个权重设置为rest的两倍。请注意,Dynamic[]及其朋友很难驯服。我不建议通过使用它们来开始学习Mma。注意了,谢谢!;-)实际上,我正试图逐步建立,但我需要确保这个特定的接口可以在Mathematica中完成,因为我正在考虑移植我在MMA中编写的整个软件,这是它的一个重要部分。记住,你可以与其他语言进行接口