Как мне построить функцию в 3D, используя mesgrid и mesh? - PullRequest
0 голосов
/ 13 апреля 2019

Итак, у меня есть очень длинная функция, которая отображает высоту для более продвинутой функции со многими пиками и впадинами.

Я должен построить эту поверхность, ограниченную по осям x и y, где x охватывает от 0 до 10 из 1000 равномерно распределенных точек, аналогично для y.

Однако я не совсем понимаю тонкости сетки и сетки.

Как упоминалось ранее, здесь запутанная функция, которую я должен построить.

 function z = topography(x,y)


z= 0.001*(x-3).^2   +0.001*(y-4).^2 ...   
+0.5*exp(-0.25.*(x-11).^2-0.01*y.^2)...     
+0.5*exp(-0.01.*x.^2-0.25*(y-11).^2)...     
+0.5*exp(-0.1.*(x+1).^2-0.01*(y-5).^2)...    
+0.3*exp(-0.1.*(x-3.5).^2-0.5*(y+1).^2)... 
+0.5*exp(-0.1.*(x-8).^2-0.1*(y-0).^2)...  
+1.*exp(-0.1.*(x-9).^2-0.1*(y-8.5).^2)...  
+0.5*exp(-0.5.*(x-6).^2-0.1*(y-6).^2)...   
+0.25*exp(-0.5.*(x-3).^2-0.5*(y-8).^2)...  
+0.5*exp(-(x-5).^2-0.5*(y-5).^2)...    
+0.25*exp(-0.75.*(x-2).^2-(y-8).^2)...
+0.5*exp(-(x-6).^2-0.5*(y-3).^2)...
+0.5*exp(-(x-5).^2-0.5*(y-9).^2)...
+0.5*exp(-(x-9).^2-0.5*(y-5).^2);



end

Вот метод без использования сетки:

xx=linspace(0,10,1000); % A vector with x-values from 0 to 10
yy=linspace(0,10,1000); % A vector with y-values from 0 to 10
zz=zeros(length(xx)); % A matrix of z-values
for i = 1 : length(xx)
   for j = 1 : length(yy)
         zz(i,j)= topography(xx(j),yy(i));
   end
end
figure(1);
mesh(xx, yy, zz) % The graph z=f(x,y) for topography

И это моя попытка преобразовать его в скрипт, используя вместо этого сетку сетки

xx = linspace(0,10,1000);
yy=linspace(0,10,1000);

zz=topography(x,y);

[x,y,z]=meshgrid(xx,yy,zz);

mesh(z);

Я ожидаю хороший 3D-график, изображающий длинную функцию "топограф". Вместо этого я получаю сообщение об ошибке:

Requested 1000x1000x10201 (76.0GB) array exceeds maximum array size 
preference. Creation of
arrays greater than this limit may take a long time and cause MATLAB to become 
unresponsive.
See array size limit or preference panel for more information.

Error in meshgrid (line 77)
        xx = repmat(xx, ny, 1, nz);

Error in figure11 (line 6)
[x,y,z]=meshgrid(xx,yy,zz);

Он говорит, что массив превышает предел массива. Но почему это не относится к рабочему сценарию, где это делается с помощью циклов?

1 Ответ

0 голосов
/ 13 апреля 2019

meshgrid обычно используется только для генерации независимых переменных. Как только сетка независимых переменных создана, зависимые переменные вычисляются с использованием их.

Таким образом, в вашем сценарии плоскость x - y создается с использованием meshgrid, а топография (т. Е. Высота) создается путем оценки функции с помощью сетки:

x = linspace(0,10,1000);
y = linspace(0,10,1000);

[xx, yy] = meshgrid(x,y);
zz = topography(xx, yy);

mesh(xx, yy, zz);

Предполагается, что функция полностью векторизована, поэтому она может получать матрицы и создавать матрицу одинакового размера. И функция размещенной топографии выглядит именно так.

...