现有的两个答案解释了为什么您无法如此轻松地找到确切的交叉点。但您真正需要的是回答该怎么做以获得精确的交叉点?
在您的具体情况下,您知道要找出交集的分析函数。您可以将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。如果你怀疑你的函数是什么样的,这根本不是没有希望的。
那么,如果你的函数更加混乱,会发生什么?在一般情况下,您可以使用插值函数来扮演上面示例中的y1fun 和y2fun 的角色,例如使用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,您都会获得一个交叉点。通过仔细选择起点,您应该能够尽可能准确地找到所有零点。