Отладка рабочей программы на Mathematica 5 с помощью Mathematica 7 - PullRequest
2 голосов
/ 20 апреля 2010

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

Plot3D[{Re[Exp[1/(x + I y)]]}, {x, -0.02, 0.022}, {y, -0.04, 0.042}, 
 PlotRange -> {-1, 8}, PlotPoints -> 120, Mesh -> False, 
 ColorFunction -> Function[{x1, x2, x3}, Hue[Arg[Exp[1/(x1 + I x2)]]]]]

либо я получаю ошибку 1/0 и ошибку e ^ \ infinity, либо, если я уменьшу опции PlotPoints, скажем, 60, ошибку переполнения. Хотя у меня есть рабочий выход, но это не то, что должно быть. Кажется, что оттенок рассеивается от левого угла, тогда как он должен рассеивать начало координат (как видно на оригинальном выводе )

Вот оригинальная программа, которая, очевидно, работает на Mathematica 5 (Trott, Руководство по программированию Mathematica):

Off[Plot3D::gval];

Plot3D[{Re[Exp[1/(x + I y)]], Hue[Arg[Exp[1/(x + I y)]]]},
       {x, -0.02, 0.022}, {y, -0.04, 0.042},
       PlotRange -> {-1, 8}, PlotPoints -> 120, Mesh -> False]

Off[Plot3D::gval];

Однако, ColorFunction, использованный таким образом (первый аргумент Plot3D) не работает, и поэтому я попытался просто приспособиться к его новому способу использования.

Ну, спасибо, наверное!

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

Если вы удовлетворены настройками Mathematica по умолчанию, вы можете использовать старую версию кода, просто вырежьте , Hue[Arg[Exp[1/(x + I y)]]] и функция будет работать нормально.

Проблемы с новой версией кода, похоже, связаны с выражением Exp[1/(x1 + I x2)] - иногда это требует оценки 1/0. По крайней мере, если я вырежу 1/, программа будет выполняться (на Mathematica 7) без жалоб, хотя, очевидно, с неправильными цветами. Поэтому вам, вероятно, нужно переписать свою цветовую функцию.

1 голос
/ 24 апреля 2010

Я наконец нашел два альтернативных способа решения моей проблемы. Первый - просто использовать команду << Version5`Graphics`, чтобы использовать функцию Plot3D так, как она работает с Mathematica V5. Код, взятый из книги, работает так же, как и раньше.

Однако, если кто-то хочет правильно отобразить оттенок (то есть без диффузии из левого угла) с последней версией, необходимо использовать функцию Rescale, например:

Plot3D[Evaluate[Re[f[x, y]]], {x, -.02, .022}, {y, -0.04, 0.042},
PlotRange -> {-1, 2}, PlotPoints -> 120, Mesh -> False,
ColorFunction -> Function[{x, y, z}, Hue@Rescale[Arg[f[x, y]], {-π, π}]],
ColorFunctionScaling -> False,
ClippingStyle -> None]

Полагаю, функция аргумента в Mathematica не отображается автоматически в диапазон [-Pi, Pi), и поэтому ее необходимо масштабировать в эту область. Результат довольно симпатичный, хотя с оригинальным сюжетом есть небольшие отличия.

...