У меня есть две пары кривых, и каждая пара имеет точку пересечения с другим значением времени (x-значение). Теперь мне нужно двигаться одна кривой каждую пару одинаково в направлении х, пока обе точки пересечения не имеет то же время значение/х-аргумент:Синхронизировать точки пересечения двух пар кривых с fminsearch
Это только примеры, можно предположить, такая же монотонность (но, возможно, разные формы) для всех моих реальных случаев, как в моем примере. Также кривые одного цвета имеют один и тот же x-вектор (но не обязательно равноудаленные). Между двумя цветами (1 = красный и 2 = синий) x-range и количество элементов могут быть совершенно разными.
входных кривые, полученных с помощью:
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
в File Exchange, которая возвращает значение точки пересечения 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
. Но мне не хватает Оптимизация Toolbox. Есть ли способ?