2017-02-07 3 views
2

Я хочу построить двумерную функцию полярных координат r и theta в трехмерных декартовых координатах. У меня есть, что (извините о плохой математике форматирования, LaTeX не совместимы, кажется)Как построить двумерную функцию в трехмерном пространстве с MATLAB?

f(r,theta) = r/2 * (cos(theta - pi/4) + sqrt(1 + 1/2 * cos(2*theta))) 

Преобразование r и theta в декартовых координатах

x = r * cos(theta), y = r * sin(theta) 

Далее, домен -1<r<1 и 0<theta<2 * pi, которые я определяю по

r = -1:2/50:1; 

и

theta = 0:2*pi/50:2*pi; 

Дает мне два вектора одинаковых размеров.

я могу определить x и y значения, используемые для построения графиков в виде векторов строк по

x = r. * cos(theta); 

и

y = r. * sin(theta); 

Так что теперь мне нужно определить z значения, которые будут зависеть от значений от x и y. Я думал, что должен сделать 101x101, где каждый элемент матрицы содержит точку данных конечной поверхности. Но как мне это сделать? Я думал об использовании двойных for цикла:

for i=1:numel(r) 
    for j=1:numel(theta) 
     z(i,j) = r(i)/2 .* cos(theta(j) - pi/4) + r(i).*sqrt(1 + 1/2 * cos(2.*theta(j))); 
    end 
end 

Тогда просто surf(z)

Хотя это, безусловно, дает мне поверхность, это дает мне неправильную поверхность! Я не знаю, что здесь происходит. Неправильная поверхность приведена на рисунке 1, а правильная приведена на рисунке 2. Может ли кто-нибудь помочь мне? Для справки, правильный поверхность была построена с GeoGebra, используя

A = Function[<expression 1>, <Expresison 2>, <Expression 3>, <var 1>, <start>, <stop>, <var 2>, <start>, <stop>] 

Incorrect surface

Рисунок 1. Неправильная поверхность.

Correct surface

Рисунок 2. Правильная поверхность.

+0

Вы пытаетесь конвертировать из полярной (сферической) в декартовых? Или от цилиндрической до декартовой? – toshiomagic

+0

Постарайтесь выяснить, помогает ли [это] (https://www.mathworks.com/matlabcentral/fileexchange/13200-3d-polar-plot). Мне удалось запечатлеть только верхнюю половину поверхности. – EBH

ответ

1

Как уже говорили другие, вы можете использовать meshgrid, чтобы сделать эту работу.

Вот ваш пример с использованием сеточных r и theta и анонимную функцию, чтобы заменить двойную петлю:

r = -1:2/50:1; 
theta = 0:2*pi/50:2*pi; 

% define anonymous function f(r,theta) 
f = @(r,theta) r/2 .* (cos(theta - pi/4) + sqrt(1 + 1/2 .* cos(2.*theta))); 

% generate grids for r and theta 
[r, theta] = meshgrid(r,theta); 
% calculate z from gridded r and theta 
z = f(r,theta); 

% convert r,theta to x,y and plot with surf 
x = r.*cos(theta); 
y = r.*sin(theta); 
surf(x,y,z); 
0

Чтобы получить , необходимо использовать координаты, если вы хотите использовать surf. Берем x и y (нижний регистр), вызовите

[X,Y] = meshgrid(x,y); 

Тогда X и Y (в верхнем регистре) будут иметь те же значения, что вы дали, но изложенные в двумерном массиве, как ожидалось surf. Прокрутите здесь индексы и вычислите Z, который должен иметь all(size(Z) == size(X)).

https://www.mathworks.com/help/matlab/ref/meshgrid.html

Смежные вопросы