2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Mathematica: почему движутся оба локатора?
Сообщение03.01.2011, 18:32 
Аватара пользователя
Хочу провести синусоиду через две точки, заданные локаторам. В формуле, может, напутал, но всё равно непонятно, почему если хватаешь за один локатор, движутся оба?

Код:
DynamicModule[{p2, ampl, shift},
p1 = {0, 1};
p2 = {1, 0};
Dynamic[
  ampl = p1[[2]];
  shift = p1[[1]];
  freq = ArcCos[p2[[2]]/ampl]/(p2[[1]] - shift);
  Show[
   Plot[ampl*Cos[(x - shift)*freq], {x, -10, 10}],
   Graphics[{
     Locator[Dynamic[p1]],
     Locator[Dynamic[p2]]
     }],
   PlotRange -> {{-10, 10}, {-1, 1}}
   ]
  ]
]
Dynamic[p1]

 
 
 
 Re: Mathematica: почему движутся оба локатора?
Сообщение04.01.2011, 21:55 
Аватара пользователя
Хоть объясните: считаете ли вы это багом или я неправильно понимаю работу Dynamic?

 
 
 
 Re: Mathematica: почему движутся оба локатора?
Сообщение04.01.2011, 23:27 
Увы, боюсь, не у всех Mathematica такая новая. У меня пятая. :) А что говорит справка?

 
 
 
 Re: Mathematica: почему движутся оба локатора?
Сообщение05.01.2011, 00:27 
В таком виде у меня тоже не работает. Но я динамические переменные программирую несколько в ином стиле, и вот какой рабочий вариант получился у меня:
Код:
Manipulate[Module[{ampl, shift, freq},
  ampl = p1[[2]];
  shift = p1[[1]];
  freq = ArcCos[p2[[2]]/ampl]/(p2[[1]] - shift);
  Plot[ampl*Cos[(x - shift)*freq], {x, -10, 10},
   PlotRange -> {{-10, 10}, {-1, 1}}]
  ], {{p1, {0, 1}}, Locator}, {{p2, {1, 0}}, Locator}
]

Использую версию 7.0.2

 
 
 
 Re: Mathematica: почему движутся оба локатора?
Сообщение05.01.2011, 00:55 
Аватара пользователя
Да, при помощи Manipulate у меня тоже получилось. Однако, в справке написано, что Dynamic -- это базис для Manipulate, поэтому я пытался всё делать с помощью него. Непонятно, почему мой вариант работает именно так.

Я установил, что для того, чтобы локаторы получались связаны, нужно, чтобы присутствовала функция Plot.

Например, в таком варианте

DynamicModule[{p2, ampl, shift}, p1 = {0, 1};
p2 = {1, 0};
Dynamic[ampl = p1[[2]];
shift = p1[[1]];
freq = ArcCos[p2[[2]]/ampl]/(p2[[1]] - shift);
Show[Graphics[Line[{p1, p2}]],
Graphics[{Locator[Dynamic[p1]], Locator[Dynamic[p2]]}],
PlotRange -> {{-10, 10}, {-1, 1}}]]]
Dynamic[p1]

локаторы можно двигать независимо, хотя это принципиально то же самое, а если вписать совершенно любой Plot (даже рисующий константный график), локаторы оказываются зависимы.

Кроме того, зависимость управляется наличием p1 и/или p2 в тексте программы. Так, если там присутствует только одна переменная, то второй локатор получается зависимым от первого, но не наоборот.

Казалось бы, функция Dynamic очень удобна: есть сложное выражение или программа и можно любые его подвыражения пометить Dynamic-ом, если ты хочешь, чтобы они автоматически обновлялись при появлении на экране.

Ан нет, что-то они там нахимичили...

Непонятно, столько помпы, за такую цену программу продают -- а я постоянно на баги натыкаюсь!

 
 
 
 Re: Mathematica: почему движутся оба локатора?
Сообщение05.01.2011, 15:20 
Dims в сообщении #395400 писал(а):
а я постоянно на баги натыкаюсь!
В пятой не было. :-)
Я бы покопался в справке по этим функциям на их сайте, но, боюсь, одной справкой без приложения к опыту не пойму.

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group