Построение трехмерной поверхности в Matlab - PullRequest
1 голос
/ 05 января 2020

У меня есть следующая функция:

function
Я хочу построить ее в MATLAB при −15 ≤ x ≤ 15 и −15 ≤ y ≤ 15.

То, что я пробовал, это:

[x,y] = meshgrid(-15:1:15, -15:1:15);
z = ((x^4 + y^4 - 4 * x^2 * y^2)/(x^2 + y^2));
plot(x,y,z)

Когда я запускаю его, он говорит: Warning: Matrix is singular to working precision. Data must be a single matrix Y or a list of pairs X,Y.

И моя переменная z содержит только двойную 31x31, заполненную NaN .

1 Ответ

3 голосов
/ 05 января 2020

Проблема порождена делением на член x ^ 2 + y ^ 2, который в некоторых случаях фактически равен нулю, и неправильным использованием вами операторов Matlab. Наконец, функция plot не подходит для построения трехмерной поверхности. Я бы порекомендовал использовать вычисления Symboli c для простоты:

syms x y; 
z = ((x^4 + y^4 - 4 * x^2 * y^2)/(x^2 + y^2));
fsurf(z,[-15,15,-15,15])

enter image description here

Вы также можете использовать свою версию нумерации c (быстрее ), но позаботьтесь о том, чтобы использовать правильные операторы - вместо умножения матрицы * используйте, например, поэлементное умножение .*. Это относится и к ^ и /.

[x,y] = meshgrid(-15:1:15, -15:1:15);
z = ((x.^4 + y.^4 - 4 .* x.^2 .* y.^2)./(x.^2 + y.^2));
surf(x,y,z)

enter image description here

Обратите внимание, что в этом случае источник не определен - из-за проблемы деления на ноль. Вы можете использовать другой диапазон, чтобы избежать этой проблемы, если хотите.

[x,y] = meshgrid(-15:0.17:15, -15:0.17:15);
z = ((x.^4 + y.^4 - 4 .* x.^2 .* y.^2)./(x.^2 + y.^2));
surf(x,y,z,'EdgeAlpha',0) % The above range is dense - so we remove the edge coloring for clarity. 

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...