Пример ColorFunctionScaling из справки Mathematica не удается - почему? - PullRequest
2 голосов
/ 23 марта 2011

В справке Mathematica 7 есть пример для Plot> Options> ColorFunctionScaling .

Table[Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, 
  ColorFunction -> Function[{x, y}, Hue[x]], 
  ColorFunctionScaling -> cf], {cf, {False, True}}]

enter image description here

Когда я сам оцениваю его на Mathematica 7 , оба выходных графика выглядят как на слева .

Однако, если я оцениваю это, я получаю график на справа , как показано выше:

Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, 
 ColorFunction -> Function[{x, y}, Hue[x]], 
 ColorFunctionScaling -> True]

Почему приведенный пример может потерпеть неудачу?


Алексей и Саймон продемонстрировали, что это не результат HoldAll, как я предполагал ранее.

Наличие примера наводит меня на мысль, что он когда-то работал, и информациято, что это работает в версии 8, говорит мне, что поведение изменилось.Что именно изменилось?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Ваш вопрос действительно интересный.Упомянутый метод предоставления значений опций встроенным функциям широко используется в документации.Тот факт, что он не работает только для ColorFunctionScaling, выглядит как ошибка.И информация о том, что в v.8 эта проблема не существует, подтверждает, что это ошибка в v.7.

В любом случае рассмотрите следующее:

In[1]:= SetAttributes[f, HoldAll]
f[__, OptionsPattern[ColorFunctionScaling -> False]] := 
 OptionValue[ColorFunctionScaling]
Table[f[Sin[4 Pi x], {x, 0, 1/2}, 
  ColorFunctionScaling -> cf], {cf, {False, True}}]


Out[3]= {False, True}

Вы можете видеть, что атрибут HoldAll в действительности не препятствует замене cf.

Таким образом, действительно интересно, что послужило причиной описанного некорректного поведения Plot с Table в v.7?

1 голос
/ 02 мая 2011

Эта ошибка на самом деле связана с атрибутом HoldAll, но я обманул эту проблему с автоматической загрузкой , заставив ее думать, что это не так.Это можно увидеть, выполнив следующее:

Plot[Sin[x], {x, 0, Pi}];

Unprotect[Plot]
ClearAttributes[Plot, HoldAll]

Table[Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, 
  ColorFunction -> Function[{x, y}, Hue[x]], 
  ColorFunctionScaling -> cf], {cf, {False, True}}]

Первый Plot необходим для активации загрузки пакета.

Поэтому можно получить правильное поведение, заключив ColorFunctionScaling -> ... в Evaluate:

Table[Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, 
  ColorFunction -> Function[{x, y}, Hue[x]], 
  Evaluate[ColorFunctionScaling -> cf]], {cf, {False, True}}]

enter image description here

1 голос
/ 23 марта 2011

Порядок оценки, похоже, немного вышел. Это работает, если вы принудительно подставили cf перед просмотром команды Plot. Для этого мы используем конструкцию With[{x=x},...]:

Table[With[{cf = cf}, 
  Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, 
   ColorFunction -> Function[{x, y}, Hue[x]], 
   ColorFunctionScaling -> cf]], {cf, {False, True}}]

plot

Странно, что вам не нужен такой клад в Mathematica версии 8.

Еще более странно, что в документации по Mathematica 7 есть пример, в котором предварительно оцененная графика не соответствует тому, что производится в этой версии. (Хорошая находка, кстати)

...