如何在matlab中找到匹配两条曲线的比例因子?

如何在matlab中找到匹配两条曲线的比例因子?,matlab,curve-fitting,Matlab,Curve Fitting,我有两个数据集是在不同的日子获得的。我从两个不同的数据集得到的结果形状相似,但数值不同,见图1。我试图将第二个数据集x2,y2与第一个数据集x1,y1进行匹配,方法是将第二个数据集x中的常数a和y中的常数B相乘,见图2。 例如: 数据1: x1=[-0.3:0.06:2.1]' y1=[0.001 0.001 0.004 0.014 0.052 0.166 0.330 0.416 0.340 0.247 0.194 0.197 0.237 0.330 0.428 0.542 0.669 0.7

我有两个数据集是在不同的日子获得的。我从两个不同的数据集得到的结果形状相似,但数值不同,见图1。我试图将第二个数据集x2,y2与第一个数据集x1,y1进行匹配,方法是将第二个数据集x中的常数a和y中的常数B相乘,见图2。

例如:

数据1:

x1=[-0.3:0.06:2.1]'

y1=[0.001 0.001 0.004 0.014 0.052 0.166 0.330 0.416 0.340 0.247 0.194 0.197 0.237 0.330 0.428 0.542 0.669 0.767 0.855 0.900 0.913 0.904 0.873 0.811 0.765 0.694 0.631 0.585 0.514 0.449 0.398 0.351 0.309 0.273 0.233 0.211 0.182 0.154 0.137 0.117 0.101 ]';

数据2

x2=[-0.3:0.06:2.1]'

y2=[0.000 0 0 0 0.025 0.230 0.447 0.425 0.269 0.194 0.225 0.326 0.477 0.636 0.791 0.931 1.036 1.104 1.117 1.123 1.062 0.980 0.897 0.780 0.675 0.571 0.471 0.390 0.309 0.258 0.209 0.161 0.129 0.099 0.079 0.063 0.047 0.038 0.027 0.023 0.015 ]';

为了找出比例因子A和B,我考虑通过最小化数据1和x修改数据2之间的增量y来获得B。然而,我有一个很好的方法来找出a。我应该如何找到a和B来匹配这两条曲线?非常感谢您的帮助。

要确定一个值,您需要进行互相关,但不是测试一系列的时间延迟,而是测试一系列的x乘数,即A值

假设您有一个要测试的a值范围,将每条曲线中对应于相同x值的点相乘,并将这些乘积相加,从而在两条曲线x1、y1和a*x2、B*y2之间建立相关性。这将为您提供一个数字,表示特定A值处的相关性

对每个电位A值重复上述步骤。给出最大相关结果的值是最匹配x维中两条曲线的A值


此方法要求您测试的A值提供与原始x值同步的新x值,以便两条曲线具有相同x值的值。

如果您有优化工具箱或访问任何无约束非线性最小化例程,则可以执行以下操作:

定义一个函数,用于计算两条曲线之间的误差

function err = sqrError(coeffs, x1, y1, x2, y2)
    % Interpolation of 'y2' with scaled 'x2' into the domain 'x1' 
    y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1);
    % Squred error calculation
    err = sum((coeffs(2)*y2sampledInx1-y1).^2);
end
使用fminunc或任何可用的优化器计算系数:

coeffs = fminunc(@(c) sqrError(c,x1, y1, x2, y2),[1;1]);

A = coeffs(1);
B = coeffs(2);
plot(x1, y1, A*x2, B*y2)

谢谢,这很有帮助。你能给我一些指导,告诉我如何将新的x值与原来的x值同步吗?@Tai Yen Chen:问得好。您可以通过使用您喜欢的任何A值,然后将生成的Ax2、By2数据内插到x1值,从而避免担心完全同步x值,仅用于计算相关性。插值将减少局部最大值,但在足够精细的x分辨率下,这不会对相关结果产生太大影响。@b3:我刚刚用jonnats post进行了测试,它似乎有效。但在日常工作中,它不计算相关系数。只是好奇,你对此有何评论?谢谢。@Tai Yen Chen-jonnat的解决方案使用FMINCON来最小化差异,即两条曲线之间的平方误差。就像我的相关性建议一样,这是一种量化两条曲线的相同性的方法,目的是判断哪些参数值,即a和B提供了最佳结果。@jonnat:这对我发布的数据集很有效。但我有一个问题,当你使用fminunuc时,你如何确定最小范围[1,1]?当我使用其他数据集进行测试时,它显示了一条错误消息,如???在28处使用==>根时出错,根的输入不能包含NaN或Inf。您知道这可能是什么原因吗?感谢您的帮助。此错误意味着代码中的操作生成了一个NaN或Inf,而不是一个有限数。这可能有很多原因,包括对fminunc的无界目标函数或简单的错误,例如除以0。如果要为系数添加边界,请使用fmincon而不是fminunc。如果您想知道NaN或Inf的确切生成位置,请在代码开头使用dbstop If naninf。如果仍然找不到问题,请打开一个新问题。最后,如果我的答案适用于你的例子,请接受它,以便其他人知道它是有效的。