Скриптик для MATLAB для нахождения точек пересечения последовательностей данных (одинакового размера).
В отличии от функций fzero или fsolve он возвращает все точки пересечений на промежутке. Тут применена линейная интерполяция, поэтому результат точнее, чем простой поиск ближайшего значения. Также не требуется точное выражение функции, а лишь отдельные точки данных, что очень удобно для обработки экспериментальных данных с шумами.
Matlab M | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| clear, clc
% некоторые данные:
x = 0:10;
y1 = randn(size(x));
y2 = randn(size(x));
% находим индексы элементов, где разность меняет знак
d = y2-y1;
s = abs(diff(sign(d)));
id = find( s>0 );
% пустые массивы (заготовки)
t = zeros(size(id));
f = zeros(size(id));
for k = 1:length(id)
i = id(k); % индексы левых точек
% находим коэф-ты прямой:
a1 = (y1(i+1)-y1(i))/(x(i+1)-x(i));
a2 = (y2(i+1)-y2(i))/(x(i+1)-x(i));
b1 = y1(i)-a1*x(i);
b2 = y2(i)-a2*x(i);
% имеем два уравнения:
% f = a1*t + b1;
% f = a2*t + b2;
% получаем систему:
% -a1*t + f = b1;
% -a2*t + f = b2;
% матрица коэф-тов:
A = [-a1, 1;
-a2, 1];
% столбец левой части:
B = [b1; b2];
u = A\B; % решаем систему
% сохраняем результат:
t(k) = u(1);
f(k) = u(2);
end
% plot them all! ^__^
plot(x, y1,'-b', x,y2,'-r', t,f,'ok','linew',2)
grid on |
|
Результаты разных вариантов данных:
 |