MATLAB: 插值以找到直线和曲线的交点的x值

4
这是我目前拥有的图表: The Dotted Blue line represented the y value that corresponds to the x value I am looking for. I am trying to find the x values of the line's intersections with the blue curve(Upper) 虚线蓝线表示我正在寻找的x值所对应的y值。我正试图找到这条线与蓝色曲线(上部)的交点的x值。由于交点不在已定义的点上,我们需要插值出一个落在上部图中的点。
以下是我手头拥有的信息: LineValue - 交点的y值和虚线的值(y = LineValue) Frequency - 包含此图中可见的x值坐标的数组。对应于LineValue的插值Frequency值是我们要找的 Upper/Lower - 包含此图的y值信息的数组

3个回答

8

这个解决方案改进了Amro的答案。不使用fzero,而是通过查找逻辑比较到LineValue的系列的一阶差分中的转换来计算线条的交点。因此,使用Amro的示例数据:

>> x = linspace(-100,100,100);
>> y =  1-2.*exp(-0.5*x.^2./20)./(2*pi) + randn(size(x))*0.002;
>> LineValue = 0.8;

找到连续点的那些片段的起始索引,这些点超过了LineValue

>> idx = find(diff(y >= LineValue))
idx =
48 52

然后,您可以使用加权平均值(即线性插值)计算交点的x位置:

>> x2 = x(idx) + (LineValue - y(idx)) .* (x(idx+1) - x(idx)) ./ (y(idx+1) - y(idx))
x2 =
-4.24568579887939 4.28720287203057

绘制这些点以验证结果:

>> figure;
>> plot(x, y, 'b.-', x2, LineValue, 'go', [x(1) x(end)], LineValue*[1 1], 'k:');

enter image description here

这种方法的优点是:

  • 交点的计算是矢量化的,因此无论交点数量如何都可以使用。
  • 算术确定交点比使用fzero快。

2

使用FZERO的示例解决方案:

%# data resembling your curve
x = linspace(-100,100,100);
f = @(x) 1-2.*exp(-0.5*x.^2./20)./(2*pi) + randn(size(x))*0.002;
VALUE = 0.8;

%# solve f(x)=VALUE
z1 = fzero(@(x)f(x)-VALUE, -10);  %# find solution near x=-10
z2 = fzero(@(x)f(x)-VALUE, 10);   %# find solution near x=+10

%# plot
plot(x,f(x),'b.-'), hold on
plot(z1, VALUE, 'go', z2, VALUE, 'go')
line(xlim(), [VALUE VALUE], 'Color',[0.4 0.4 0.4], 'LineStyle',':')
hold off

screenshot


0

你的数据序列中步长是否相同? 假设控制方程是立方、正弦等等...

文档插值 寻找零交叉点


数据应该是正弦的。 - Alex Nichols

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接