2014 dxdy logo

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

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




 
 Как в Mathematica построить график в сферических координатах
Сообщение07.08.2018, 15:31 
Всем привет!
Решая одну техническую задачку, получил список (aka массив, упорядоченные тройки, кортежи ...) данных в виде {(x1,y1,z1), (x2,y2,z2), ... , (xn,yn,zn)}, причем две переменные, скажем x и y - значения углов.
Построил график (x,y,z) в обычных декартовых координатах. Хотел построить график в более естественных для моей задачи координатах - сферических, но столкнулся с неожиданной проблемой: Grapher (не говоря уже про MathCad и Excel) не умеет этого делать (писал в техподдержку Golden Software - ответили, что пока не поддерживает сферические координаты).
Решил попробовать в Mathematica, но, как я понял, и она не может. Возможно, я ошибаюсь, т.к. до этого момента не работал в этой программе.
Может кто-нибудь подсказать, действительно ли великая и ужасная Mathematica не может построить поверхность в сферических координатах по уже известному набору троек (xi,yi,zi)}, а делает это только для параметрически заданной функции? И если да, то что тогда может?

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение07.08.2018, 16:41 
Аватара пользователя
Используйте функцию SphericalPlot3D. Нюансы её использования найдёте в справке.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение08.08.2018, 09:43 
SurfacePlot3D, как оказывается, не может построить поверхность по заданному набору троек. Пробовал, читал Help - не вышло. На Community.Wolfram нашел такую же тему обсуждения (http://community.wolfram.com/groups/-/m/t/521885), где мои выводы подтвердились - SurfacePlot3D строит только параметрически заданный график. Такие дела...

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение08.08.2018, 12:33 
Можно попробовать получить искомую функцию путём интерполяции:
Код:
f=InterpolatingFunction[{{{x1,y1},z1}, {{x2,y2},z2}, ... , {{xn,yn},zn}}];SphericalPlot3D[f[x, y], x, y]

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение08.08.2018, 13:38 
Аватара пользователя
max_m в сообщении #1331147 писал(а):
не может построить поверхность по заданному набору троек.

А это, в принципе, возможно??
Если в случае линии ещё можно полагаться на то в каком порядке указаны точки, то для поверхности этого недостаточно.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение09.08.2018, 14:12 
Sender, спасибо за совет. Теперь смогу им воспользоваться только через пару недель, но по результатам отпишусь.

Geen, я думаю, что вполне можно. Мое отображение биективно, а показать, как можно их соединить, можно, если представить, что все мои точки накрывает "вуаль", которая стремится стянуться к центру. Это как с тройками в декартовых координатах, где "вуаль" падает на точки.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение09.08.2018, 21:36 
Аватара пользователя
Я, конечно, был невнимателен, порекомендовав вам SphericalPlot3D. Она строит график функции в сферических координатах, но именно что функции. Но и вы, max_m, хороши. В ответ начали плести что-то о некоей функции SurfacePlot3D, которой в WL вообще нет.
С соображениями Sender согласен, можно попробовать.
max_m в сообщении #1331386 писал(а):
Geen, я думаю, что вполне можно. Мое отображение биективно, а показать, как можно их соединить, можно, если представить, что все мои точки накрывает "вуаль", которая стремится стянуться к центру. Это как с тройками в декартовых координатах, где "вуаль" падает на точки.
Теперь неплохо бы как-нибудь объяснить системе понятия «нутро» и «чуять» «вуаль» и «стремление стянуться»...
Есть ещё функция ListSurfacePlot3D (а, может, вы её и имели в виду?), можно с нею поколдовать.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение10.08.2018, 10:21 
Да, был невнимателен, когда писал SurfacePlot3D - имел ввиду, конечно же, SphericalPlot3D. Прошу прощения.
Что касается "вуали" и прочих метафор, то я просто хотел этим сказать, что нет принципиальных отличий в построении поверхностей по известному набору точек в декартовых и сферических координатах. И, как мне казалось, команды системе на эти построения не должны сильно отличаться друг от друга. Но, видимо, здесь все не так просто, раз ни одна из известных мне программ не может выполнить построение в сферических координатах по точкам.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение10.08.2018, 11:59 
Команда Мэйпла
Код:
plots:-pointplot3d
работает со сферической системой координат. См. справку. Пример по требованию.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение10.08.2018, 12:21 
А Mathematica принципиальна?

Если нет, возьмите gnuplot и
Код:
set mapping spherical
splot "data.dat"
где data.dat - файл с данными.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение10.08.2018, 12:28 
Markiyan Hirnyk, Pphantom, спасибо за советы! Как и говорил, попробовать смогу через пару недель. По результатам отпишусь.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение10.08.2018, 17:02 
Вроде бы в Maple pointplot3d (по крайней мере, в старых версиях) используется для построения точек (например, для предварительного анализа), а не поверхности. Например. Пусть в списке Data находится список координат $(\rho, \varphi, \theta)$. Cтроим точки, которые для наглядности изображаем маленькими окружностями.
Код:
> with(plots):
> L:= 30: M := 20: rho:= 1:
> Data:= [seq(seq([rho, evalf(2*Pi/L*i), evalf(Pi/M*j)], i=0..L), j=0..M)]:
> pointplot3d(Data, axes = boxed, symbol=circle, symbolsize=4, labels=['x', 'y', 'z'], coords=spherical);
Вложение:
pointplot3d.PNG
Если есть возможность построить поверхность при помощи pointplot3d, то пример интересен.

-- Fri 10.08.2018 16:15:45 --

Для построения поверхности в Maple по списку точек, первое приходящее в голову --- функция surfdata. Но тут не всё оказывается так уж просто [и хорошо], особенно в старых версиях, например 15.
-= Добавлено =-
В простейших случаях surfdata, конечно, позволяет построить поверхность. Maple 15:
Код:
> with(plots):
> L:= 30: M := 20: rho:= 1:
> Data:= [seq([seq([rho, evalf(2*Pi/L*i), evalf(Pi/M*j)], i=0..L)], j=0..M)]:
> surfdata(Data, axes=frame, labels=[x,y,z], coords=spherical);
Вложение:
surfdata.PNG
Но это почти эквивалентно её заданию в виде функции от двух параметров: имеется регулярная сетка. Опцию source=irregular функция surfdata в Maple 15 не поддерживает.


У вас нет доступа для просмотра вложений в этом сообщении.

 
 
 
 Re: Как в Mathematica построить график в сферических координатах
Сообщение12.08.2018, 00:58 
max_m в сообщении #1331551 писал(а):
Но, видимо, здесь все не так просто, раз ни одна из известных мне программ не может выполнить построение в сферических координатах по точкам.
Как я понял, поверхность в начальном сообщении задана координатами точек в сферической системе координат (с.с.к.), а получить нужно рисунок поверхности в прямоугольной декартовой системе координат (п.д.с.к.). Особенностью большинства пакетов является необходимость задать координаты в виде прямоугольных матриц, в частности, так обстоят дела в Mathcad.

1. Предположим результаты измерений (расчетов) можно представить в виде следующей матрицы: вдоль строки меняются значения угла $\varphi$, вдоль столбца — значения угла $\theta$, а значения — величина радиуса $\rho$. (Можно, конечно, чтобы вдоль столбца менялись значение $\varphi$, а вдоль строки — $\theta$). В этом простейшем случае даже Mathcad легко справится с построением рисунка, если поверхность достаточно «плавная». Зная значения $\varphi$, $\theta$ и $\rho$, рассчитываются матрицы значений координат X, Y, Z. В приводимом ниже рисунке для простоты рассмотрен случай сферы. Mathcad 15.
Вложение:
mathcad.PNG

2. Более трудный случай — это когда результаты измерений (расчетов) не могут быть представлены в виде матрицы. (В самом крайнем случае значения двух координат, например углов, могут быть случайными числами. Такой вариант часто демонстрируется в примерах.) В этом случае для получения прямоугольных матриц в пакетах часто предусматривают функции выполняющие перерасчет при помощи интерполяции. В matlab (по крайней мере, в старых версиях) нужно явно воспользоваться функцией griddata. Однако во многих пакетах (например, в matlab, по крайней мере, в старых версиях) такая интерполяция работает, если поверхность является графиком функции двух независимых переменных. Если поверхность не испытывает быстрых изменений высоты, то такая интерполяция позволяет удовлетворительно построить поверхность. См. примеры использования Matlab на оф. сайте. Однако, если функция меняется быстро, то результат не очень. Пример с верхней полусферой, Octave 4.4
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
n = 50;
phi = 2*pi*rand(1, n) ;
theta = pi/2*rand(1, n);
rho = 1;
# Запись в файл коорд. точек поверхности в с.с.к. для получения рисунка в gnuplot
fid = fopen('sphere_1.txt', 'wt');
for i=1:n
 fprintf(fid, '%17.15f %17.15f %17.15f \n', phi(i), theta(i), rho);
end
fclose(fid);
# Конец записи в ф. координат точек поверхности в с.с.к.
X = rho*cos(phi).*sin(theta);
Y = rho*sin(phi).*sin(theta);
Z = rho*cos(theta);
# Запись в файл коорд. точек поверхности в п.д.с.к. для получения рисунка в gnuplot
fid = fopen('sphere_2.txt', 'wt');
for i=1:n
 fprintf(fid, '%20.15f %20.15f %20.15f \n', X(i), Y(i), Z(i))
end
fclose(fid);
# Конец записи в ф. коорд. точек поверхности в п.д.с.к.
[Xi,Yi] = meshgrid (linspace (-rho, rho, 100));
[Xi, Yi, Zi] = griddata(X, Y, Z, Xi, Yi);
surf(Xi, Yi, Zi);
Вложение:
griddata.PNG

gnuplot позволяет построить рисунок поверхности по данным в файле в виде таблицы или по списку точек линий. Данные для разных линий отделяются пустой строкой. Если линии не должны формировать единую поверхность, то — двумя пустыми строками. Не добавляя пустые строки, попробуем построить рисунки поверхности. Версия 5.0.0 gnuplot.
Используется синтаксис Gnuplot
# Рисунок полусферы по точкам с координатами в сферической системе;
# файл c координатами - sphere_1.txt  
set    xrange    [-1:1]
set    yrange    [-1:1]
set    zrange    [ 0:1]
set    mapping   spherical
set    hidden3d
set    terminal  png
set    output  "sphere_1.png"
splot 'sphere_1.txt' with pm3d
Вложение:
sphere_1.png
В случае координат, заданных в п.д.с.к., использование стиля pm3d привело к предупреждению
Код:
Warning: Single isoline (scan) is not enough for a pm3d plot.
           Hint: Missing blank lines in the data file? See 'help pm3d' and FAQ.
Получить хоть какой-то рисунок получилось с with lines
Используется синтаксис Gnuplot
# Рисунок полусферы по точкам с координатами в п.д.с.к.;
# файл c координатами - sphere_2.txt  
set    xrange    [-1:1]
set    yrange    [-1:1]
set    zrange    [ 0:1]
set    hidden3d
set    terminal  png
set    output  "sphere_2.png"
splot 'sphere_2.txt' with lines
Вложение:
sphere_2.png
В общем, с ходу у меня в gnuplot что-то не очень получилось.

Golden Software Surfer 11 с настройками по умолчанию смог построить поверхность по данным shpere_2.txt (но очень лихо экстраполировал данные).
Вложение:
sphere_SurfaceMap_GSS.png

(Surfer предназначен для получения по нерегулярным данным регулярных сеток; возможности достаточно большие.)


У вас нет доступа для просмотра вложений в этом сообщении.

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


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