Это решение является улучшением ответа Амро . Вместо использования 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
Затем вы можете рассчитать координаты х точек пересечения, используя средневзвешенные значения (то есть линейную интерполяцию):
>> 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
.