Поиск точек пересечения графиков с помощью octave / matlab

У меня есть несколько точек данных, которые показаны ниже, и я хотел бы найти значение частоты, когда значение амплитуды пересекает 4. Я включил пример вместе с точками данных в приведенный ниже пример. Я обвел ответ графически, но я не уверен, как вычислить его математически и получить все значения для желаемых частот. Как я могу сделать это с помощью Octave / Matlab? Также есть математический термин для обозначения того, что я пытаюсь сделать?

В этом примере я пытаюсь получить 5 частот (но это всего лишь пример). Я знаю два ответа: 30 и 80, но не знаю, как получить остальные. Полный список может быть тысячи. Я использую октаву 3.8.1

clear all,clf, clc,tic
%graphics_toolkit gnuplot %use this for now it's older but allows zoom
freq=[20,30,40,50,60,70,80];
amp_orig=[2,4,3,7,1,8,4];
amp_inv=[6,4,5,1,7,0,4];


plot(freq,amp_orig,'-bo')
hold on
plot(freq,amp_inv,'-r*')
xlabel ("Frequency");
ylabel ("Amplitude");

введите описание изображения здесь

Спасибо


person Rick T    schedule 22.09.2014    source источник
comment
Это помогает? mathworks.com/matlabcentral/fileexchange/   -  person amo    schedule 23.09.2014
comment
Чтобы ответить на ваш другой вопрос, вы пытаетесь найти пересечение линий. Этот вопрос дает хороший обзор различных методов.   -  person MrAzzaman    schedule 23.09.2014
comment
@amo спасибо, но эта функция не будет работать с октавой 3.8.1   -  person Rick T    schedule 23.09.2014


Ответы (2)


Попробуйте эту функцию из File Exchange, она кажется, отлично работает в Octave. x0 - интересующие частоты:

>> [x0,y0,iout,jout] = intersections(freq,amp_orig,freq,amp_inv)
x0 =

   30.000
   30.000
   42.500
   55.000
   64.286
   80.000

y0 =

   4.0000
   4.0000
   4.0000
   4.0000
   4.0000
   4.0000

iout =

   2.0000
   2.0000
   3.2500
   4.5000
   5.4286
   7.0000

jout =

   2.0000
   2.0000
   3.2500
   4.5000
   5.4286
   7.0000
person am304    schedule 23.09.2014

Если у вас есть доступ к Matlabs Mapping Toolbox, ваша проблема может быть легко решена с помощью функции polyxpoly(). Он найдет пересечения двух графиков. Они даже не обязательно должны быть линиями, также работают полигоны. Вот пример для вашего случая:

%graphics_toolkit gnuplot %use this for now it's older but allows zoom
freq=[20,30,40,50,60,70,80];
amp_orig=[2,4,3,7,1,8,4];
amp_inv=[6,4,5,1,7,0,4];

plot(freq,amp_orig,'-bo')
hold on
plot(freq,amp_inv,'-r*')
xlabel ('Frequency');
ylabel ('Amplitude');

%// find and add intersections
[xi,yi] = polyxpoly(freq,amp_orig,freq,amp_inv)
plot(xi, yi,'ro','markersize',20) %// draw the red circles automatically :-)

Результат выглядит так: введите описание изображения здесь

person Nras    schedule 23.09.2014
comment
Спасибо, но я использую октаву, и похоже, что в панели инструментов сопоставления еще нет функции polyxpoly. - person Rick T; 23.09.2014
comment
@RickT Правильно, polyxpoly() является частью Mapping Toolbox, я должен был упомянуть об этом в ответе. Жаль, это действительно облегчило бы вашу проблему. - person Nras; 23.09.2014