Matlab 创建一组正交轴
我需要为模拟创建一系列向量,这些向量给出传播方向和光的偏振(3维)。因为方向和极化必须是正交的,所以我需要这样的东西:Matlab 创建一组正交轴,matlab,axes,orthogonal,Matlab,Axes,Orthogonal,我需要为模拟创建一系列向量,这些向量给出传播方向和光的偏振(3维)。因为方向和极化必须是正交的,所以我需要这样的东西: D= [dir1; P=[pol11; dir1; pol12; dir2; pol21; dir2; pol21; dir3; pol31; .... ] ... ] 正如你所看到的,每个方向都有两个极化。这里重要的是dir1*pol11'=0,dir1*p
D= [dir1; P=[pol11;
dir1; pol12;
dir2; pol21;
dir2; pol21;
dir3; pol31;
.... ] ... ]
正如你所看到的,每个方向都有两个极化。这里重要的是dir1*pol11'=0,dir1*pol12'=0,依此类推。方向应该跨越整个立体角,而偏振方向并不是严格意义上的重要方向,不过如果它们彼此正交,那就更好了。我尝试了两种不同的方法,一种是创建一个基本正交基并旋转它,另一种是创建一个方向矩阵并使用null()函数来创建偏振。在这两种情况下,我得到的是,如果我做D*P,我得到的是一系列0,但其中一些值不是零-非常小(例如1e-17),但仍然不是零。
代码1:
代码2:
bDir=[1,0,0;1,0,0]
dir=bDir
pol=[0,1,0;0,0,1]
for phi=0:pi/5:2*pi
for theta=0:pi/5:pi
rotatePhi=[cos(phi) -sin(phi) 0;...
sin(phi) cos(phi) 0;...
0 0 1];
rotateTheta=[cos(theta) 0 sin(theta);...
0 1 0;...
-sin(theta) 0 cos(theta)];
rDir=bDir*rotateTheta*rotatePhi;
rPol=null(rDir)';
dir=vertcat(dir,rDir);
pol=vertcat(pol,rPol);
end
end
我认为问题在于matlab引入了一些精度误差,但可能是错误的。
有人能告诉我我的代码中是否有错误,或者是否有更好的方法来获得我正在寻找的两个矩阵吗?我想你对我的期望有点低。浮点运算不精确。在MATLAB中,浮点算术运算通常只精确到16位小数(
1e-16
)。任何小于此值的值通常都可视为0
MATLAB中的函数可用于确定MATLAB能够表示的最小浮点数。在我的系统上,它产生
>> eps
ans =
2.2204e-16
任何小于此值的数字都无法准确表示
除了浮点运算的精度外,将它们与
0
的整数值进行比较通常也是错误的。更准确的比较是
if dir*pol < 1e-16
fprintf(1, 'Orthogonal\n');
else
fprintf(1, 'Not Orthogonal\n');
end
if dir*pol<1e-16
fprintf(1,'正交\n');
其他的
fprintf(1,'非正交\n');
结束
在大多数情况下,当使用浮点运算时,通常在MATLAB中给定上述eps
输出,任何小于2.2204e-16
的值都有效地0
如果您确实需要可变精度算法,可以使用。但是,它通常是不必要的,只要您知道它的缺点,浮点运算就足够了。谢谢您的回答。我意识到了“局限性”。我的问题是,我没有直接使用这些值,而是使用它们作为工具箱的输入。我猜,工具箱会检查偏振方向是否正交,如果发现不是正交方向,则返回错误。我不能改变工具箱(如果可以的话,我不确定结果会是什么),所以我实际上在寻找一种替代方法来获得方向和极化。任何替代方法都会在我的答案中遇到同样的问题。
if dir*pol < 1e-16
fprintf(1, 'Orthogonal\n');
else
fprintf(1, 'Not Orthogonal\n');
end