首页 文章

在matlab中绘制差异误差

提问于
浏览
2

我写了一个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)

1 回答

  • 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), '.-')
    

    Plot

    PS与你的问题无关:看看here如何在Matlab中避免 for 循环,让你的代码更快更容易阅读(和写) .

相关问题