Поиск места пересечения графиков с октавой / матлабом

У меня есть несколько точек данных, которые приведены ниже, и я хотел бы найти значение частоты, когда значение амплитуды пересекает 4. Я включил пример вместе с точками данных в пример ниже. Я обвел ответ графически, но я не уверен, как рассчитать его математически и получить все значения для желаемых частот. Как я могу сделать это с октавой / 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");

Спасибо

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

Если у вас есть доступ к 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 :-)

Результат выглядит так

Другие вопросы по тегам