Поиск места пересечения графиков с октавой / матлабом
У меня есть несколько точек данных, которые приведены ниже, и я хотел бы найти значение частоты, когда значение амплитуды пересекает 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 :-)
Результат выглядит так