使用fminsearch同步两对曲线的交点

时间:2013-12-02 14:49:41

标签: matlab optimization minimize fminsearch

我有两对曲线,每对都有一个不同时间值(x值)的交点。现在我需要移动每对的一条曲线在x方向上,直到两个交点具有相同的时间值/ x-argument:

enter image description here

这些只是示例,您可以假设我的所有实际案例中的相同的单调性(但可能是不同的形状)。同样相同颜色的曲线具有相同的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]);

我使用 File Exchange 处的函数InterX计算的交点,它返回交点的xy值。该示例的预期输出只是猜测来说明我的问题。

我的问题是,如何确定输入和输出之间的时间延迟?

[ 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

d0开头,应该增加,直到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 个答案:

答案 0 :(得分: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