4

我有两对曲线,每对曲线在不同的时间值(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]);

我使用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

d开始0并且应该增加,直到dxy2.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但我缺少优化工具箱。有什么办法吗?

4

1 回答 1

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

给出所需的情节:

在此处输入图像描述

于 2013-12-03T12:16:58.253 回答