MATLAB: Interpolating to find the x value of the intersection between a line and a curve

﹥>﹥吖頭↗ 提交于 2019-11-30 22:19:26

Example solution using 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

b3.

This solution is an improvement on Amro's answer. Instead of using fzero you can simply calculate the intersection of the line by looking for transition in the first-difference of the series created by a logical comparison to LineValue. So, using Amro's sample data:

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

Find the starting indices of those segments of consecutive points that exceed LineValue:

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

idx =

    48    52

You can then calculate the x positions of the intersection points using weighted averages (i.e. linear interpolation):

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

x2 =

         -4.24568579887939          4.28720287203057

Plot these up to verify the results:

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

The advantages of this approach are:

  • The determination of the intersection points is vectorized so will work regardless of the number of intersection points.
  • Determining the intersection points arithmetically is presumably faster than using fzero.

Are the step sizes in your data series the same? Is the governing equation assumed to be cubic, sinuisoidal, etc..?

doc interpl Find the zero crossings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!