【问题标题】:MATLAB: Losing points near singularities?MATLAB:在奇点附近丢失点?
【发布时间】:2013-10-02 17:30:00
【问题描述】:

我正在尝试绘制区间 (0,3) 上支持的一些凹凸函数。我已经分段定义了函数,使其在区间外为零。这是函数:

function d = bump2(t)  
         region1 = (t > 0) & (t < 3);
         d(region1) = exp(1./(t(region1).^2 - 3*t(region1)));

         region2 = (t <= 0) & (t >= 3);
         d(region2) = 0;
end

如果我设置x = -1:.01:4 并尝试运行plot(x,bump2(x)),我会收到一个错误消息,告诉我我的向量长度不同。这确实是正确的,因为length(x) = 501length(bump2(x)) = 400 然而,当我设置x = .01:.01:2.99 时,一切检查正常并且向量的长度相等。

另外,奇怪的是,我还有另一个类似的功能

function b = bump(t)
         region1 = abs(t) < 1;
         b(region1) = exp(-1./(1 - ((t(region1)).^2)));

         region2 = abs(t) >= 1;
         b(region2) = 0;
end

我从来没有遇到过这个问题。为什么这两个功能不同?为什么当我排除点 0 和 3 时第一个函数会起作用,即使我已经定义了函数以避免那里可能出现的奇点?

【问题讨论】:

    标签: matlab plot


    【解决方案1】:

    这是因为 b(region1) 正在修剪矢量 x 的末端,因此它的大小不同。

    考虑是否设置x = -1:3,然后运行代码plot(x, bump3(x));

    function d = bump3 (t)
        region1 = (t > 0) & (t < 3);
        d(region1) = t(region1);
    end
    

    然后你会遇到同样的问题。问题是在bump3里面你有

    K>> region1
    
    region1 =
    
         0     0     1     1     0
    

    现在这就是诀窍。该 region1 的数据类型为 logical,因此 MATLAB 会解释下一行

     d(region1) = t(region1);
    

    作为

    d(find(region1)) = t(find(region1));
    

    但是如果你写了

    d = [];
    d(5) = 1;
    

    那么你会在零处得到一堆零,所以你在这里做。

    您可能会考虑修改为 d = t(region1); 以仅获取好的值,但是您仍然遇到大小问题。一种解决方案是将您与新值一起使用的索引作为额外的返回值返回,如下所示:

    执行:

    x = -1:3;
    [y region1] = bump4(x);
    plot(x(region1), y);
    

    像这样修改凹凸功能的地方:

    function [d region1] = bump4 (t)
        region1 = (t > 0) & (t < 3);
        d = t(region1);
    end
    

    编辑:

    如果您确实想要左右两侧的额外零,您也可以通过在代码中使用之前初始化 d 来解决此问题,如下所示:

    function d = bump2(t)  
             region1 = (t > 0) & (t < 3);
             d = zeros(size(t));
             d(region1) = exp(1./(t(region1).^2 - 3*t(region1)));
    
             region2 = (t <= 0) & (t >= 3);
             d(region2) = 0;
    end
    

    因为我设置了 d = zeros(...) ,所以你在区域之外有零,在它里面有你的凹凸函数。另一种看待问题的方法是,MATLAB 在左侧填充而不在右侧填充,因为您从未在那里设置空白值。这通过告诉 MATLAB d 应该有多大来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 2016-12-26
      相关资源
      最近更新 更多