Синхронизируйте точки пересечения двух пар кривых с помощью fminsearch
У меня есть две пары кривых, и каждая пара имеет точку пересечения с различным значением времени (значение x). Теперь мне нужно переместить одну кривую каждой пары одинаково в направлении x, пока обе точки пересечения не будут иметь одинаковое значение времени / аргумент x:
Это всего лишь примеры, вы можете предполагать одинаковую монотонность (но, возможно, разные формы) для всех моих реальных случаев, как в моем примере. Также кривые одного цвета имеют один и тот же x-вектор (но не обязательно равноудаленный). Между двумя цветами (1= красный и 2= синий) x-диапазон и количество элементов могут быть совершенно разными.
входные кривые, сгенерированные:
t1 = linspace(0,3,30);
t2 = linspace(0,5,15);
x1 = t1.^2.*5;
x2 = -t2.^2.*3+50;
y1 = t1.*2;
y2 = t2;
ip_x = InterX([t1;x1],[t2;x2]);
ip_y = InterX([t1;y1],[t2;y2]);
Пересечения я рассчитываю с помощью функции InterX
при обмене файлами, который возвращает x
а также y
значение точки пересечения. Предполагаемый результат для примера только предположил, чтобы проиллюстрировать мою проблему.
У меня вопрос, как я могу определить задержку между входом и выходом?
[ t1,x1,y1,t2,x2,y2 ] = findIntersectPair(t1,x1,y1,t2,x2,y2);
Мой подход использует fminsearch
но я сталкиваюсь с проблемами после нескольких итераций.
function [ t1,x1,y1,t2,x2,y2 ] = findIntersectPair(t1,x1,y1,t2,x2,y2)
d0 = 0;
[d,dxy] = fminsearch(@findDelay,d0);
function dxy = findDelay( d )
disp(['d = ' num2str(d)])
t2 = t2 - d;
ip1 = InterX([t1;x1],[t2;x2]);
ip2 = InterX([t1;y1],[t2;y2]);
dxy = ip1(1)-ip2(1);
disp(['dxy = ' num2str(dxy)])
end
[t1,x1,y1,x2,y2] = deal(t1,x1,y1,x2,y2);
t2 = t2 - d;
end
d
начинается с 0
и должен быть увеличен, пока dxy
(начиная с 2.5
в этом случае) становится 0
,
Кажется, это хорошо работает для первых итераций, но в какой-то момент изменение d
слишком большой, так что точки пересечения больше нет, и функция вылетает:
d = 0
dxy = 2.4998
d = 0.00025
dxy = 2.4995
...
d = 0.00175
dxy = 2.4936
d = 0.00275
dxy = 2.4898
...
d = 0.38375
dxy = 0.67101
d = 0.51175
dxy = -0.11166
d = 0.76775
Логическим выводом было бы использовать fmincon
вместо. Но мне не хватает панели инструментов оптимизации. Есть ли способ обойти?
1 ответ
Там нет необходимости fmincon
- ошибка, наконец, была довольно простой.
В этой строке: t2 = t2 - d
Я предположил t2
будет исходным из начального вызова функции, но это не правильно. Он перезаписывается с каждой итерацией и поэтому постепенно увеличивается.
Временная переменная tt
решил проблему.
Конечный результат:
function [ t1,x1,y1,t2,x2,y2 ] = findIntersectPair(t1,x1,y1,t2,x2,y2)
[d,dxy] = fminsearch(@findDelay,0);
function dxy = findDelay( d )
tt = t2 - d;
ipx = InterX([t1;x1],[tt;x2]);
ipy = InterX([t1;y1],[tt;y2]);
dxy = abs(ipx(1)-ipy(1));
end
[t1,x1,y1,x2,y2] = deal(t1,x1,y1,x2,y2);
t2 = t2 - d;
end
дает желаемый участок: