我在遇到以下功能时遇到了一些问题:
function czeb()
k = 1:1:5;
Xk = cos( (pi*(k-0.5))/5);
CN(5,Xk)
end
function c = CN(N,x)
a=N*acos(x); % a is equal correct
c = cos(a); % buc c not, why?
return
end
如果我查看变量我收到的CN功能
a=[1.5708, 4.7124, 7.8540, 10.9956, 14.1372]
CN函数中正确的下一步是计算cos(a)。
在此步骤中,我收到不正确的cos(a)值。
应该是
cos(a) = 1.0e-04 *[-0.0367,0.1102,-0.1837,0.2571,-0.3306]
但它是1.0e-15 * [-0.8269,-0.1837,0.3062,-0.4286,0.5511]
,我不知道为什么......
答案 0 :(得分:1)
有一个非常简单的解释,你的功能没有错。
a=[1.5708, 4.7124, 7.8540, 10.9956, 14.1372]
等于pi/2 + k * pi
。当你取a的余弦时,你就会得到零。 1.0e-15 * 0.8269
基本上为零(浮点运算和舍入误差)。
答案 1 :(得分:1)
我想,我理解你的。您是否已创建预期值手册,例如cos(1.5708)
?如果是,那么您将始终收到与计算机结果不同的结果。所以,我认为,数组a
的预期值是不正确的。
首先,在MATLAB / Octave中启用长数字格式:
format long;
之后,如果您显示a
数组,您将看到类似的输出:
> a
a =
1.57079632679490 4.71238898038469 7.85398163397448 10.99557428756428 14.13716694115407
正如您在此步骤中看到的,MATLAB / Octave的预期值和计算值是不同的。如果你做cos(1.57079632679490)
,结果将会-3.49148336110938e-15
,而且如您所见,这接近于cos(a(1))
:-8.26948102009006e-16
的结果。这意味着您存储的号码与您在输出中看到的号码不同。
要获得与预期相同的结果 - 将逗号后的a
四舍五入到第四个数字:
a = round(a*10000)/10000;
有了这个,计算结果应该接近你的预期结果。