用MATLAB画三维向量
前两天,我在写Gram-Schmidt正交化的文章时,想到最好用matlab把还没有经过正交化计算的原始向量,和已经经过正交化处理后的正交基,在三维坐标系中,用图像的方式表示出来。这样可以更加直观的看到向量与向量之间的“垂直”,而不是通过计算向量之间的内积去证明他们“正交”。
事实上,我之前多次有过在三维坐标系中作图的需求,一直也没有找到非常合适的。比如说,在三维坐标系中画一个点,等。这一次,我在画三维向量的时候,无意中找到了一个函数quiver3(),他可以实现在三维坐标系中画一个或多个三维向量的问题。
1,首先,我们用quiver3函数画一个向量v=[1,2,8]
先定义向量的坐标原点为[0,0,0]
X=[0];
Y=[0];
Z=[0];
定义一个三维向量
U=[1];
V=[2];
W=[8];
画图
figure;
quiver3(X,Y,Z,U,V,W,0,'LineWidth',1)
其中,“W”后面的参数“0”,表示的是对图像中向量长度的缩放(只能是一个正整数,例如2,这就是说,图像中向量的长度是实际向量长度的两倍),也就是上面语法中的Scale。一般情况下,如果你不输入scale参数,例如,直接使用quiver3(X,Y,Z,U,V,W),为了美化图像matlab会自动对向量的长度进行适当的缩放。所以,要想在图像中“按照一比一的比例”画出我们输入的向量,我们应该把scale参数关掉,关掉的方法就是令scale=0,即off。(默认为auto)
"LineWidth"表示图画中线的宽度,一般不用可以去设置,我这里写的1,是为了看的更清楚,默认值可能是0.5或者0.7吧,反正没有1粗。
最终得到如下图像,为了显示scale=0的效果,我把默认值scale=auto的图像也给出来了。
向量[1,2,8]在x-y平面的投影图
向量[1,2,8]在x-z平面的投影图
从上面的比较图可以看出,当scale=0,也就是auto scale为off时(上图右边)。向量在x,y,z各个方向的长度都和我们实际输入的一致,但如果是auto scale(上图左边),可以看到向量的长度相对于右图会有一定比例的缩小。
这是matlab官方文档中,对“Scale”参数的说明和部分图示:
最后输入:
axis equal
他让每个坐标轴都使用统一标准的刻度尺去绘图,这也就是说,matlab在用quiver3去画向量图的时候,他也默认对坐标轴进行了不同程度的缩放,以至于,本例中的向量[1,2,8],在图中看起来,箭头在x,y,z三个方向的长度都差不多。在z方向的比例尺为0,2,4,6,8(红色),x轴的比例尺为0,0.2,0.4,0.6,0.8,1(黄色),在y轴方向的比例尺为0,0.5,1,1.5,2(蓝色)。
输入axis equal后,因为,向量在x,y,z各轴,都使用同一尺寸的标准刻度,因为,向量[1,2,8]的方向也会非常精准,如下图所示。
2,我们用quiver3函数画2个向量v1=[1,1,1],v2=[1,3,5]
一样,先分别定义两个向量的坐标原点[0,0,0],其中X,Y,Z中的第一个元素表示的是第一个向量v1的起始坐标,第二个元素是第二个向量v2的起始坐标。
X=[0,0];
Y=[0,0];
Z=[0,0];
其次,输入两个向量v1,v2,同样,v1中的三个值,被分别存放在U,V,W的第一个元素中,v2中的三个值则放在U,V,W的第二个元素中。
U=[1,1];
V=[1,3];
W=[1,5];
画图
figure;
quiver3(X,Y,Z,U,V,W,0,'LineWidth',1)
legend('v1,v2','Location','northwest')
其中,函数legend()用于给图像配上说明文字。如果要在图中把两个向量区别开,并用不同颜色来表示,则要像之前画单个向量的方法一个个的画。
X=[0];
Y=[0];
Z=[0];
U=[1];
V=[1];
W=[1];
quiver3(X,Y,Z,U,V,W,0,'LineWidth',1)
axis equal
hold on
U=[1];
V=[3];
W=[5];
quiver3(X,Y,Z,U,V,W,0,'LineWidth',1)
axis equal
legend('v1','v2','Location','northwest')
两个的向量的颜色也可以通过参数color单独指定,‘r’为红色,‘k’为黑色:
X=[0];
Y=[0];
Z=[0];
U=[1];
V=[1];
W=[1];
quiver3(X,Y,Z,U,V,W,0,'LineWidth',1,'Color','r')
axis equal
hold on
U=[1];
V=[3];
W=[5];
quiver3(X,Y,Z,U,V,W,0,'LineWidth',1,'Color','k')
axis equal
legend('v1','v2','Location','northwest')
如果想用不同的自定义颜色,可参考如下说明: