【问题标题】:Finding intersection between two functions using Matlab or Scilab使用 Matlab 或 Scilab 查找两个函数之间的交集
【发布时间】:2016-06-18 21:43:51
【问题描述】:

我正在这样做:

>> plot(x,y1,x,y2);
>> x=0:0.001:5;
>> y1=sin(x)+cos(1+x.^2)-1;
>> y2 = ((1/2).*x)-1;
>> find (y1==y2)

得到这个:

ans =

   Empty matrix: 1-by-0

作为一个答案,它简直让我发疯!我不知道为什么 Matlab 和 Scilab 没有给我相交的答案。我一直在尝试使间隔更小,例如x = 0:0.0001:5;但它没有改变任何东西。我怎样才能让它返回给我的交集值?

谢谢。

【问题讨论】:

  • 哦,忘了补充,这两个函数在选择的区间内有三个交点。
  • 我添加了一个答案来说明应该如何处理这样的数值问题。

标签: matlab function intersection scilab


【解决方案1】:

您必须记住,Matlab 用于找到问题的数值解。您正在提供一组离散的输入点 x=0:0.001:5;,并要求它计算离散的输出点 y1[x]y2[x]。这意味着y1y2 不是连续的,也不一定像它们的连续对应物那样相交。我没有 Matlab,所以我没有运行你的代码,但你的离散函数很可能不会相交。也就是说,a = y1[x_i]b = y2[x_i] 不存在一对点,其中a = b。相反,您最可能想要做的是寻找y2-y1 在特定输入处位于零的一侧,而在下一个输入处位于零的另一侧的点。这意味着函数的连续对等部分会在两者之间的某个地方交叉。

函数相遇但不交叉的情况有点棘手,但同样的想法。

编辑:

这种东西最容易让你用图像来环绕你的脑袋,所以我创建了一个来说明我的意思。

在这里,我使用的点数比您尝试使用的点数少得多,但想法是一样的。您可以看到 y1 和 y2 的连续版本在几个地方交叉,但是您要求 matlab 做的是在 y1 中找到一个点,该点等于 y2 中的点,对于相同的 x 值。在这张图片中,您可以看到很多很接近,但是您的计算机以非常高的精度存储浮点数,因此它们实际上相等的机会非常小。

当您增加采样点的数量时,图像开始看起来更像是它的连续对应物。

【讨论】:

    【解决方案2】:

    现有的两个答案解释了为什么您无法如此轻松地找到确切的交叉点。但您真正需要的是回答该怎么做以获得精确的交叉点?

    在您的具体情况下,您知道要找出交集的分析函数。您可以将fzero 与(可选匿名)函数一起使用,以查找由两个原始函数的差异定义的函数的零:

    y1fun = @(x) sin(x)+cos(1+x.^2)-1;
    y2fun = @(x) ((1/2).*x)-1;
    diff_fun = @(x) y1fun(x)-y2fun(x);
    x0 = 1; % starting point for fzero's zero search
    x_cross = fzero(diff_fun,x0);
    

    现在,这将为您提供 one 差函数的零,即您的函数的 one 交集。事实证明,找到函数的每个零是一项具有挑战性的任务。一般来说,你必须多次调用fzero,不同的起点x0。如果你怀疑你的函数是什么样的,这根本不是没有希望的。

    那么,如果你的函数更加混乱,会发生什么?在一般情况下,您可以使用插值函数来扮演上面示例中的y1funy2fun 的角色,例如使用interp1

    % generate data
    xdata = 0:0.001:5;
    y1data = sin(xdata)+cos(1+xdata.^2)-1;
    y2data = ((1/2).*xdata)-1;
    
    y1fun = @(x) interp1(xdata,y1data,x);
    y2fun = @(x) interp1(xdata,y2data,x);
    x0 = 1; % starting point for fzero's zero search
    x_cross = fzero(@(x)y1fun(x)-y2fun(x),x0);
    

    这又回到了原来的问题。请注意,interp1 默认使用线性插值,具体取决于您的函数的外观以及数据的分散方式,您可以选择其他选项。还要注意外推选项(要避免)。

    因此,在这两种情况下,每次调用fzero,您都会获得一个交叉点。通过仔细选择起点,您应该能够尽可能准确地找到所有零点。

    【讨论】:

      【解决方案3】:

      也许这两个向量在任何地方都没有完全相等的值。您可以尝试搜索最小的差异:

      abs(y1-y2)<tolerance
      

      其中容差=0.001 是一个小数字

      【讨论】:

        猜你喜欢
        • 2021-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多