Как определить значения параметров графически, под ограничения? - PullRequest
15 голосов
/ 23 октября 2011

Я пытаюсь выяснить, возможно ли реализовать следующий интерфейс Mathematica.

Я хотел бы создать интерфейс в Mathematica, с помощью которого пользователь сможет графически и интерактивно определять произвольное числочисловые параметры, с учетом ограничения.

Параметры, о которых идет речь, представляют собой числовые веса [0,1], каждый из которых связан с соответствующим критерием и ограничен суммированием до единицы.Очевидно, что это ограничение вызывает компромисс с весами, которые могут быть связаны с каждым критерием, и я хотел сделать такой компромисс очевидным графически, имея интерактивный график в соответствии с тем, что следует (сделано в Excel, к сожалению):

Example of graphical weight definition

В этом примере есть 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]}]

Ответы [ 2 ]

12 голосов
/ 24 октября 2011

Возможно что-то вроде этого:

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

enter image description here

enter image description here

9 голосов
/ 24 октября 2011

Может быть что-то вроде этого

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

Снимок экрана:

screenshot

...