[英]MATLAB: Interpolating to find the x value of the intersection between a line and a curve
这是我目前的图表:
虚线蓝线表示与我正在寻找的x值相对应的y值。 我试图找到线与蓝色曲线(上)的交点的x值。由于相互作用不落在已经定义的点上,我们需要插入一个落在上图上的点。
这是我的信息:
LineValue - 交集的y值和虚线的值(y = LineValue)Frequency - 包含此图中所示x值坐标的数组。 对应于LineValue的频率的插值是我们正在寻找的上/下 - 包含此图的y值信息的数组
这个解决方案是对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:');
这种方法的优点是:
fzero
更快。 使用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
数据系列中的步长是否相同? 控制方程是假设为立方,正弦等。?
doc interpl找到过零点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.