我有两对曲线,每对都有一个不同时间值(x值)的交点。现在我需要移动每对的一条曲线在x方向上,直到两个交点具有相同的时间值/ x-argument:
这些只是示例,您可以假设我的所有实际案例中的相同的单调性(但可能是不同的形状)。同样相同颜色的曲线具有相同的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
代替。但我缺少优化工具箱。有什么办法吗?
答案 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
给出了所需的情节: