我写了一个matlab代码,它使用中心差异近似cos(x)
的导数。
大约意味着cos(x)'=(cos(x+h)-cos(x-h))/2h
。
因为h从0.1,0.01,0.001开始,依此类推,直到10 ^ -8
这是我的代码
function [pos,neg,D]=shifted_cos(x)
for i=1:8
var=rand(1)*0.5*10^(-5);
pos(i)=cos(x+10^(-i))+var;
end
for j=1:8
var=rand(1)*0.5*10^(-5);
neg(j)=cos(x-10^(-j))+var;
end
D=pos-neg;
for k=1:8
D(k)=(D(k)/(2*10^(-k)));
end
end
请注意,名为var的变量只是我添加的随机噪声,因为任何" real"系统有噪音,它不是100%可靠,但我得到噪音不大于0.5*10^-5
这是我的问题:我现在正试图将错误绘制为h的函数。
错误我的意思是导数的实际值减去D中的值(请注意D是矢量)
所以我在控制台中写了以下几行:
[p,n,d]=shifted_cos(1.2)
h=[0.1,0.01,0.001,0.0001,0.00001,0.000001,0.0000001,0.00000001]
plot(h,abs(-sin(1.2)-d))
输出即时通讯非常奇怪。我看到一个图表,但它只是一条垂直线。
d的值是
d =
Columns 1 through 3
-0.930475812604331 -0.932134403564042 -0.932748001778061
Columns 4 through 6
-0.944125866359780 -0.991297975178052 0.416450071288876
Columns 7 through 8
8.360791447226124 10.313974302400553
所以它不应该是一条垂直线......
有人可以解释我的问题吗?
注意:我被要求在x = 1.2处将误差绘制为h的函数,并且还注意到cos(x)的导数是-sin(x)
答案 0 :(得分:2)
我只运行以下代码,并没有给我一条垂直线。然而,由于h在数量级上发生变化,因此(双)对数图将为您提供更多洞察力。
d = [ -0.930475812604331 -0.932134403564042 -0.932748001778061 ...
-0.944125866359780 -0.991297975178052 0.416450071288876 ...
8.360791447226124 10.313974302400553 ];
h = 10.^-(1:8);
%// plot 1: your plot but with adjusted axes
subplot(1, 3, 1)
plot(h, abs(-sin(1.2)-d), '.-')
xlim([-.01, .2])
ylim([-1, 18])
%// plot 2: your data, just linearly plotted
subplot(1, 3, 2)
plot(abs(-sin(1.2)-d), '.-')
%// plot 3: double logarithmic plot
subplot(1, 3, 3)
loglog(abs(-sin(1.2)-d), '.-')
PS并且与您的问题无关:看看here如何避免Matlab中的for
循环,让您的代码更快更容易阅读(并写入)。