我有两对曲线,每对曲线在不同的时间值(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
返回交点的和值。该示例的预期输出只是为了说明我的问题。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
。但我缺少优化工具箱。有什么办法吗?