Синхронизируйте точки пересечения двух пар кривых с помощью 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

дает желаемый участок:

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