我需要为模拟创建一系列向量,这些向量给出传播方向和光的偏振(3 维)。因为方向和极化需要正交所以我需要这样的东西:
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:
bDir=[1,0,0;1,0,0]
bPol=[0,1,0;0,0,1]
dir=bDir
pol=bPol
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=bPol*rotateTheta*rotatePhi;
dir=vertcat(dir,rDir);
pol=vertcat(pol,rPol);
end
end
代码 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 引入了一些精度错误,但它可能是错误的。谁能告诉我我的代码是否有错误,或者是否有更好的方法来获取我正在寻找的 2 个矩阵?