-1

我需要为模拟创建一系列向量,这些向量给出传播方向和光的偏振(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 个矩阵?

4

1 回答 1

0

我认为您对浮点运算的期望有点偏离。浮点运算并不精确。在 MATLAB 中,浮点算术运算通常只精确到小数点后 16 位 ( 1e-16)。任何小于此的值通常都可以视为0

MATLAB 中的eps函数可用于确定 MATLAB 能够表示的最小浮点数。在我的系统上它产生

>> eps
ans =

   2.2204e-16

任何小于这个 MATLAB 的数字都无法准确表示。


除了浮点运算的准确性之外,将它们与 的整数值进行比较通常也是错误的0。更准确的比较是

if dir*pol < 1e-16
    fprintf(1, 'Orthogonal\n');
else
    fprintf(1, 'Not Orthogonal\n');
end

在大多数情况下,当使用浮点运算时,通常在 MATLAB 中给出eps任何小于有效值2.2204e-16的上述输出0


如果您确实想要可变精度算术,您可以使用vpa. 但是,它通常是不必要的,只要您知道它的缺点,浮点运算就足够了。

于 2015-10-09T07:20:44.367 回答