3 个变量的函数的等高线图
Contour plot of a function of 3 variables
因为我们可以在二维中绘制 f=(x.^2) + (y.^2);
的等高线图,如下所示:
[x,y]= meshgrid(-10:10, -10:10);
contour(x,y, (x.^2)+(y.^2));
我们可以使用 contour3
在 3-D 中绘制 f=(x.^2) + (y.^2);
的等高线图
我们可以在 3-D
中绘制 f=(x.^2) + (y.^2) + (z.^2);
的等高线图吗
matlab 函数isosurface
可以完成您的要求。但是,您也可以使用其他替代方法来达到您想要的结果,例如使用 surf
。我将介绍这两种方法。
方法一:使用isosurface
我们需要为 x
、y
和 z
创建域,然后使用这些值生成 3D 网格,以便我们可以计算函数 f(x,y,z) = x^2 + y^2 + z^2
.然后,我们将给常量 k
赋值,并将所有这些信息提供给 isosurface
,以便我们可以获得满足条件的 (x,y,z)
值族:f(x,y,z) = k
.请注意,这个轮廓实际上是球体!最后,我们可以使用 patch
生成具有这些值的表面。
迭代地为 k
赋予不同的值并查看与这些值关联的轮廓是非常有趣的。
% Value for x, y and z domain.
a = 10;
% Domain for x ,y and z.
x = linspace(-a,a);
y = linspace(-a,a);
z = linspace(-a,a);
% Generate a 3D mesh with x, y and z.
[x,y,z] = meshgrid(x,y,z);
% Evaluate function (3D volume of data).
f = x.^2 + y.^2 + z.^2;
% Do contours from k = 0 to k = 100 in steps of 1 unit.
for k = 0:100
% Draw the contour that matches k.
p = patch(isosurface(x,y,z,f,k));
isonormals(x,y,z,f,p)
p.FaceColor = 'red';
p.EdgeColor = 'none';
% Adjust figure properties.
title(sprintf('Contours of f(x,y,z) = x^2 + y^2 + z^2\nwith f(x,y,z) = k = %d',k));
xlabel('x-axis');
ylabel('y-axis');
zlabel('z-axis');
axis equal;
grid on;
box on;
axis([-10 10 -10 10 -10 10]);
camlight left;
lighting phong;
% Update figure.
drawnow;
% Clear axes.
cla;
end
这是输出:
方法二:使用surf
和前面的方法一样,要对函数f(x,y,z) = x^2 + y^2 + z^2
进行等高线,我们需要将函数匹配到一个常量值,这里是f(x,y,z) = k
,其中k
是任意常量值你选。
如果我们根据 k
、x
和 y
来隔离 z
,我们有:z = ± sqrt(k-x.^2-y.^2)
,所以我们有 x
、y
和 z
。现在,让我们迭代地给 k
不同的值,看看我们用 surf
函数得到的结果!
% Do contours from k = 0 to k = 100 in steps of 1 unit.
for k = 0:100
% Find the value where: k - x^2 - y^2 = 0
a = sqrt(k);
% Domain for x and y.
x = linspace(-a,a);
y = linspace(-a,a);
[x,y] = meshgrid(x, y);
% Isolate z in terms of k, x and y.
z = sqrt(k-x.^2-y.^2);
% Find complex entries in z.
i = find(real(z)~=z);
% Replace complex entries with NaN.
z(i) = NaN;
% Draw upper hemisphere of surface.
surf(x,y,z,'FaceColor','red','EdgeColor','none');
hold on;
% Draw lower hemisphere of surface.
surf(x,y,-z,'FaceColor','red','EdgeColor','none');
% Adjust figure properties.
title(sprintf('Contours of f(x,y,z) = x^2 + y^2 + z^2\nwith f(x,y,z) = k = %d',k));
xlabel('x-axis');
ylabel('y-axis');
zlabel('z-axis');
axis equal;
grid on;
box on;
axis([-10 10 -10 10 -10 10]);
camlight left;
lighting phong;
% Update figure.
drawnow;
hold off;
end
这是输出:
参考资料
我从 David Arnold's article "Complex Numbers and Plotting in Matlab" 中汲取了一些想法,非常值得一读,将帮助您了解如何绘制生成的函数复数。
因为我们可以在二维中绘制 f=(x.^2) + (y.^2);
的等高线图,如下所示:
[x,y]= meshgrid(-10:10, -10:10);
contour(x,y, (x.^2)+(y.^2));
我们可以使用 contour3
f=(x.^2) + (y.^2);
的等高线图
我们可以在 3-D
中绘制f=(x.^2) + (y.^2) + (z.^2);
的等高线图吗
matlab 函数isosurface
可以完成您的要求。但是,您也可以使用其他替代方法来达到您想要的结果,例如使用 surf
。我将介绍这两种方法。
方法一:使用isosurface
我们需要为 x
、y
和 z
创建域,然后使用这些值生成 3D 网格,以便我们可以计算函数 f(x,y,z) = x^2 + y^2 + z^2
.然后,我们将给常量 k
赋值,并将所有这些信息提供给 isosurface
,以便我们可以获得满足条件的 (x,y,z)
值族:f(x,y,z) = k
.请注意,这个轮廓实际上是球体!最后,我们可以使用 patch
生成具有这些值的表面。
迭代地为 k
赋予不同的值并查看与这些值关联的轮廓是非常有趣的。
% Value for x, y and z domain.
a = 10;
% Domain for x ,y and z.
x = linspace(-a,a);
y = linspace(-a,a);
z = linspace(-a,a);
% Generate a 3D mesh with x, y and z.
[x,y,z] = meshgrid(x,y,z);
% Evaluate function (3D volume of data).
f = x.^2 + y.^2 + z.^2;
% Do contours from k = 0 to k = 100 in steps of 1 unit.
for k = 0:100
% Draw the contour that matches k.
p = patch(isosurface(x,y,z,f,k));
isonormals(x,y,z,f,p)
p.FaceColor = 'red';
p.EdgeColor = 'none';
% Adjust figure properties.
title(sprintf('Contours of f(x,y,z) = x^2 + y^2 + z^2\nwith f(x,y,z) = k = %d',k));
xlabel('x-axis');
ylabel('y-axis');
zlabel('z-axis');
axis equal;
grid on;
box on;
axis([-10 10 -10 10 -10 10]);
camlight left;
lighting phong;
% Update figure.
drawnow;
% Clear axes.
cla;
end
这是输出:
方法二:使用surf
和前面的方法一样,要对函数f(x,y,z) = x^2 + y^2 + z^2
进行等高线,我们需要将函数匹配到一个常量值,这里是f(x,y,z) = k
,其中k
是任意常量值你选。
如果我们根据 k
、x
和 y
来隔离 z
,我们有:z = ± sqrt(k-x.^2-y.^2)
,所以我们有 x
、y
和 z
。现在,让我们迭代地给 k
不同的值,看看我们用 surf
函数得到的结果!
% Do contours from k = 0 to k = 100 in steps of 1 unit.
for k = 0:100
% Find the value where: k - x^2 - y^2 = 0
a = sqrt(k);
% Domain for x and y.
x = linspace(-a,a);
y = linspace(-a,a);
[x,y] = meshgrid(x, y);
% Isolate z in terms of k, x and y.
z = sqrt(k-x.^2-y.^2);
% Find complex entries in z.
i = find(real(z)~=z);
% Replace complex entries with NaN.
z(i) = NaN;
% Draw upper hemisphere of surface.
surf(x,y,z,'FaceColor','red','EdgeColor','none');
hold on;
% Draw lower hemisphere of surface.
surf(x,y,-z,'FaceColor','red','EdgeColor','none');
% Adjust figure properties.
title(sprintf('Contours of f(x,y,z) = x^2 + y^2 + z^2\nwith f(x,y,z) = k = %d',k));
xlabel('x-axis');
ylabel('y-axis');
zlabel('z-axis');
axis equal;
grid on;
box on;
axis([-10 10 -10 10 -10 10]);
camlight left;
lighting phong;
% Update figure.
drawnow;
hold off;
end
这是输出:
参考资料
我从 David Arnold's article "Complex Numbers and Plotting in Matlab" 中汲取了一些想法,非常值得一读,将帮助您了解如何绘制生成的函数复数。