Форум программистов, компьютерный форум, киберфорум
Наши страницы
Зосима
Войти
Регистрация
Восстановить пароль
Оценить эту запись

MATLAB. Точки пересечения дискретных данных

Запись от Зосима размещена 04.02.2019 в 20:16
Метки matlab

Скриптик для 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
Результаты разных вариантов данных:
Нажмите на изображение для увеличения
Название: 01.jpg
Просмотров: 50
Размер:	47.5 Кб
ID:	5184 Нажмите на изображение для увеличения
Название: 02.jpg
Просмотров: 46
Размер:	47.3 Кб
ID:	5185

Нажмите на изображение для увеличения
Название: 03.jpg
Просмотров: 51
Размер:	43.9 Кб
ID:	5186 Нажмите на изображение для увеличения
Название: 04.jpg
Просмотров: 46
Размер:	41.6 Кб
ID:	5187
Размещено в Без категории
Просмотров 214 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для nuHrBuH
    Когда-то писал подобный скрипт (каждый отрезок кривой сравнивал с каждым отрезком другой кривой и смотрел, есть пересечения), а потом наткнулся на polyxpoly() где-nj в комментах на форуме Mathworks
    Запись от nuHrBuH размещена 17.05.2019 в 12:21 nuHrBuH вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru