Сюжет о сложной функции в Mathematica - PullRequest
22 голосов
/ 22 марта 2011

Как я могу создать графику Mathematica, которая копирует поведение complex_plot в sage? т.е.

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

Вот пример (украденный у М. Хэмптона из Neutral Drifts ) дзета-функции с наложенными контурами абсолютного значения:

zeta function complex_plot

На странице документации Mathematica Функции сложных переменных говорится, что вы можете визуализировать сложные функции, используя ContourPlot и DensityPlot «потенциально раскрашивая по фазе». Но проблема в обоих типах графиков: ColorFunction принимает только одну переменную, равную контуру или плотности в точке - поэтому кажется невозможным заставить его закрасить фазу / аргумент при построении абсолютного значения. Обратите внимание, что это не проблема для Plot3D, где все 3 параметра (x,y,z) передаются в ColorFunction.

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

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


Редактировать: В журнале Mathematica было несколько прекрасных статей Майкла Тротта:
Визуализация римановых поверхностей алгебраических функций , IIa , IIb , IIc , IId .
Визуализация римановых поверхностей demo .
Возвращение римановых поверхностей (обновления для Mma v6)

Конечно, Майкл Тротт написал справочники по Mathematica , которые содержат много прекрасной графики, но, похоже, отстали от ускоренного графика выпуска Mathematica!

Ответы [ 3 ]

20 голосов
/ 22 марта 2011

Вот моя попытка. Я немного подогнал функцию цвета.

ParametricPlot[
 (*just need a vis function that will allow x and y to be in the color function*)
 {x, y}, {x, -6, 3}, {y, -3, 3},

 (*color and mesh functions don't trigger refinement, so just use a big grid*)
 PlotPoints -> 50, MaxRecursion -> 0, Mesh -> 50,

 (*turn off scaling so we can do computations with the actual complex values*)
 ColorFunctionScaling -> False,

 ColorFunction -> (Hue[
     (*hue according to argument, with shift so arg(z)==0 is red*)
     Rescale[Arg[Zeta[# + I #2]], {-Pi, Pi}, {0, 1} + 0.5], 1,

     (*fudge brightness a bit: 
       0.1 keeps things from getting too dark, 
       2 forces some actual bright areas*)
     Rescale[Log[Abs[Zeta[# + I #2]]], {-Infinity, Infinity}, {0.1, 2}]] &),

 (*mesh lines according to magnitude, scaled to avoid the pole at z=1*)
 MeshFunctions -> {Log[Abs[Zeta[#1 + I #2]]] &},

 (*turn off axes, because I don't like them with frames*)
 Axes -> False
 ]

complex plot

Я не думал о хорошем способе изменения линий сетки по цвету. Проще всего просто сгенерировать их с помощью ContourPlot вместо MeshFunctions.

15 голосов
/ 22 марта 2011

Вот мой вариант функции, данной Акселем Болдтом , вдохновленным Яном Хоманом .Обе ссылки на страницы имеют приятную графику.

ComplexGraph[f_, {xmin_, xmax_}, {ymin_, ymax_}, opts:OptionsPattern[]] := 
 RegionPlot[True, {x, xmin, xmax}, {y, ymin, ymax}, opts, 
  PlotPoints -> 100, ColorFunctionScaling -> False,
  ColorFunction -> Function[{x, y}, With[{ff = f[x + I y]}, 
    Hue[(2. Pi)^-1 Mod[Arg[ff], 2 Pi], 1, 1 - (1.2 + 10 Log[Abs[ff] + 1])^-1]]]
 ]

Тогда мы можем сделать график без контуров, выполнив

ComplexGraph[Zeta, {-7, 3}, {-3, 3}]

Zeta without contours

Мыможно добавить контуры, скопировав Бретт , используя и показывая конкретную сетку графика в ComplexGraph:

ComplexGraph[Zeta, {-7, 3}, {-3, 3}, Mesh -> 30, 
 MeshFunctions -> {Log[Abs[Zeta[#1 + I #2]]] &},
 MeshStyle -> {{Thin, Black}, None}, MaxRecursion -> 0]

или комбинируя с контурной диаграммой, например

ContourPlot[Abs[Zeta[x + I y]], {x, -7, 3}, {y, -3, 3}, PlotPoints -> 100,
 Contours -> Exp@Range[-7, 1, .25], ContourShading -> None];
Show[{ComplexGraph[Zeta, {-7, 3}, {-3, 3}],%}]

with contours

8 голосов
/ 22 марта 2011

Не правильный ответ по двум причинам:

  • Это не то, что вы просили
  • Я бесстыдно использую код Бретта

В любом случае, для меня гораздо понятнее следующее (яркость ... ну, просто яркость):

enter image description here

Код Бретта почти не поврежден:

Plot3D[
 Log[Abs[Zeta[x + I y]]], {x, -6, 3}, {y, -3, 3},
 (*color and mesh functions don't trigger refinement,so just use a big grid*)
 PlotPoints -> 50, MaxRecursion -> 0, 
 Mesh -> 50, 
 (*turn off scaling so we can do computations with the actual complex values*)
 ColorFunctionScaling -> False, 
 ColorFunction -> (Hue[
     (*hue according to argument,with shift so arg(z)==0 is red*)
     Rescale[Arg[Zeta[# + I #2]], {-Pi, Pi}, {0, 1} + 0.5], 
     1,(*fudge brightness a bit:
     0.1 keeps things from getting too dark,
     2 forces some actual bright areas*)
     Rescale[Log[Abs[Zeta[# + I #2]]], {-Infinity, Infinity}, {0.1, 2}]] &),
     (*mesh lines according to magnitude,scaled to avoid the pole at z=1*)
     MeshFunctions -> {Log[Abs[Zeta[#1 + I #2]]] &},
     (*turn off axes,because I don't like them with frames*)
     Axes -> False]
...