2013-12-02 3 views
4

У меня есть две пары кривых, и каждая пара имеет точку пересечения с другим значением времени (x-значение). Теперь мне нужно двигаться одна кривой каждую пару одинаково в направлении х, пока обе точки пересечения не имеет то же время значение/х-аргумент:Синхронизировать точки пересечения двух пар кривых с fminsearch

enter image description here

Это только примеры, можно предположить, такая же монотонность (но, возможно, разные формы) для всех моих реальных случаев, как в моем примере. Также кривые одного цвета имеют один и тот же 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. Есть ли способ?

ответ

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 

дает желаемый сюжет:

enter image description here

Смежные вопросы