1

異なる日に取得した 2 つのデータ セットがあります。2 つの異なるデータ セットから取得した結果は、形状は似ていますが、値は異なります (図 1 を参照)。2番目のデータのxの定数AとyのBを乗算して、2番目のデータセット(x2、y2)を最初のデータセット(x1、y1)に一致させようとしています(図2を参照)。図1 図 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.000 0.000 0.000 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 を見つける良い方法があります。この 2 つの曲線に一致するABを見つけるにはどうすればよいですか? どんな助けでも大歓迎です。

4

2 に答える 2

0

最適化ツールボックス (または制約のない非線形最小化ルーチンへのアクセス) がある場合は、次のことができます。

2 つの曲線間の誤差を計算する関数を定義します

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)
于 2012-02-02T22:07:47.423 に答える
0

Aを決定するには、相互相関を行いたいのですが、タイムラグの範囲をテストする代わりに、x 乗数の範囲、つまりA値をテストする必要があります。

テストしたい A 値の範囲があると仮定して、同じ x 値に対応する各曲線のポイントを乗算し、2 つの曲線 (x1, y1) と (A*x2, B*y2) 間の相関を行います。これらの製品を合計します。これにより、特定の A値での相関を表す 1 つの数値が得られます。

潜在的なA値ごとに上記を繰り返します。最大の相関結果が得られるのは、x 次元の 2 つの曲線に最もよく一致するA値です。

この方法では、テストするA値が元の x 値と同期する新しい x 値を与え、両方の曲線が同じ x 値で値を持つようにする必要があります。

于 2012-02-02T20:33:32.863 に答える