Matlab,Error using surf, X, Y, Z, and C cannot be complex
Matlab, Error using surf, X, Y, Z, and C cannot be complex
i 运行 下面的代码,但是得到 X、Y、Z 和 C 不能是复杂的错误,知道哪里错了吗?
k=1;
u = linspace(0,2*pi,72);
v = [-3:.2:-1,1:.2:3];
[U,V] = meshgrid(u,v);
r=sqrt((4*V.^-k)./(cos(U).^2+k*sin(U).^2));
X = r.*cos(U);
Y = r.*sin(U);
Z = V;
这是我想要得到的图像:
完整代码为:
function simple_math_functions_animation1
clc, close all, clear all
hf1=figure(1);hold on,grid on,axis equal, view([1 -1 1])
set(hf1,'Color','w');set(hf1,'Position',[300, 600, 500, 400]);
xlabel('x');ylabel('y'),zlabel('z');
k=1;
u = linspace(0,2*pi,72);
v = [-3:.2:-1,1:.2:3];
[U,V] = meshgrid(u,v);
r=sqrt((4*V.^-k)./(cos(U).^2+k*sin(U).^2));
X = r.*cos(U);
Y = r.*sin(U);
Z = V;
surf(X,Y,Z,'EdgeColor',[0.5 1. 0.2],'FaceColor',[1 0.2 0.8],'FaceAlpha',0.6);
XYZ=[reshape(X,1,prod(size(X)));
reshape(Y,1,prod(size(Y)));
reshape(Z,1,prod(size(Z)));
ones(1,prod(size(Z)))];
phi=[0 : pi/20 : 50*pi];
h=[]; axis([-20 20 -20 20 -20 20]);
for beta=phi % animation loop *****************
T=[cos(beta) -sin(beta) 0 0; % rotation matrix
sin(beta) cos(beta) 0 0;
0 0 1 0;
0 0 0 1];
XYZ1=T*XYZ; % coordinates changing
X1=reshape(XYZ1(1,:),size(X));Y1=reshape(XYZ1(2,:),size(Y));Z1=reshape(XYZ1(3,:),size(Z));
pause(0.1);if ~isempty(h),delete(h);end
h=surf(X1,Y1,Z1,'EdgeColor',[0.5 1. 0.2],'FaceColor',[0.2 0.2 0.8],'FaceAlpha',0.6);
end % ******************************************
end
您收到复杂错误是因为 r
是复值。 r
在 X
和 Y
中都使用,所以当需要在这些输入上使用 surf
时,您最终会得到该错误。这是有道理的,因为你的 V
范围有 negative 值,当你为这个表达式设置 k=1
时:
r=sqrt((4*V.^-k)./(cos(U).^2+k*sin(U).^2));
您实际上是在尝试对 V
中的值求平方根,其中一些是负数,因此 r
是复数。如果您查看上传的实际图片,您会发现 V
中缺少一个 2
。因此:
r=sqrt((4*V.^2-k)./(cos(U).^2+k*sin(U).^2));
当我这样做时,然后尝试 运行 你的代码,我得到这个:
i 运行 下面的代码,但是得到 X、Y、Z 和 C 不能是复杂的错误,知道哪里错了吗?
k=1;
u = linspace(0,2*pi,72);
v = [-3:.2:-1,1:.2:3];
[U,V] = meshgrid(u,v);
r=sqrt((4*V.^-k)./(cos(U).^2+k*sin(U).^2));
X = r.*cos(U);
Y = r.*sin(U);
Z = V;
这是我想要得到的图像:
完整代码为:
function simple_math_functions_animation1
clc, close all, clear all
hf1=figure(1);hold on,grid on,axis equal, view([1 -1 1])
set(hf1,'Color','w');set(hf1,'Position',[300, 600, 500, 400]);
xlabel('x');ylabel('y'),zlabel('z');
k=1;
u = linspace(0,2*pi,72);
v = [-3:.2:-1,1:.2:3];
[U,V] = meshgrid(u,v);
r=sqrt((4*V.^-k)./(cos(U).^2+k*sin(U).^2));
X = r.*cos(U);
Y = r.*sin(U);
Z = V;
surf(X,Y,Z,'EdgeColor',[0.5 1. 0.2],'FaceColor',[1 0.2 0.8],'FaceAlpha',0.6);
XYZ=[reshape(X,1,prod(size(X)));
reshape(Y,1,prod(size(Y)));
reshape(Z,1,prod(size(Z)));
ones(1,prod(size(Z)))];
phi=[0 : pi/20 : 50*pi];
h=[]; axis([-20 20 -20 20 -20 20]);
for beta=phi % animation loop *****************
T=[cos(beta) -sin(beta) 0 0; % rotation matrix
sin(beta) cos(beta) 0 0;
0 0 1 0;
0 0 0 1];
XYZ1=T*XYZ; % coordinates changing
X1=reshape(XYZ1(1,:),size(X));Y1=reshape(XYZ1(2,:),size(Y));Z1=reshape(XYZ1(3,:),size(Z));
pause(0.1);if ~isempty(h),delete(h);end
h=surf(X1,Y1,Z1,'EdgeColor',[0.5 1. 0.2],'FaceColor',[0.2 0.2 0.8],'FaceAlpha',0.6);
end % ******************************************
end
您收到复杂错误是因为 r
是复值。 r
在 X
和 Y
中都使用,所以当需要在这些输入上使用 surf
时,您最终会得到该错误。这是有道理的,因为你的 V
范围有 negative 值,当你为这个表达式设置 k=1
时:
r=sqrt((4*V.^-k)./(cos(U).^2+k*sin(U).^2));
您实际上是在尝试对 V
中的值求平方根,其中一些是负数,因此 r
是复数。如果您查看上传的实际图片,您会发现 V
中缺少一个 2
。因此:
r=sqrt((4*V.^2-k)./(cos(U).^2+k*sin(U).^2));
当我这样做时,然后尝试 运行 你的代码,我得到这个: