2017-02-10 3 views
0

私はMatlabで2つの曲線を持っています。matlabで別のグラフから1つのグラフの距離を求める

曲線A:

x1 = [128 192 256 384 512 704 1024 1472 2048 2880 4096 5824 8192 11584 16384 23168]; 
y1 = [0.62 0.51 0.43 0.35 0.3 0.26 0.22 0.18 0.15 0.13 0.11 0.09 0.08 0.06 0.05 0.05]; 

曲線B:

x2 = [16 24 32 48 64 88 128 184 256 360 512 728 1024 1448 2048 2896]; 
y2 = [1.94 1.54 1.33 1.15 0.97 0.86 0.71 0.59 0.5 0.42 0.36 0.3 0.25 0.21 0.18 0.15]; 

同じプロットに(指数関数x軸)の両方の曲線を描画した後:

semilogx(x1,y1,'-o') 
hold on 
semilogx(x2,y2,'-o') 

私があることを見出しましたBカーブはAカーブより上です。しかし、BカーブがAカーブと重なるように、Bカーブを左にシフトしたい。ですから、問題は、BカーブをAカーブと重なるようにシフトする必要がある(右から左へ)量ですか?

ヒント:BからA(補間)までの垂直距離(すべてのマッチポイント)を数え、その距離を二乗してそれらを合計し、アルファの値を見つける必要があるかもしれません。 Matlabでどうすればいいですか?

+0

、それはY1

+0

いいえ!これはそれらを互いにより遠くにします。私は距離(補間)を計算したい。 – Hasan

+0

この例で期待される出力は? – smttsp

答えて

2

x2のどの値が曲線Aを正確に移動させるのかを最初に調べることによって、所望のシフトを見つけることができる。これは、曲線Aの上の点のy座標に対応する点で曲線Aを再サンプリングすることによって達成することができるB.次のコードはこれを示しています。

x軸をlog-domainにプロットするので、私はあなたがlog10(x2)をシフトすると仮定します。したがって、シフトした曲線上のx点はlog10(x2 + shift)の代わりにlog10(x2) + shiftになります。データを見ると

% find the subset of y2 which is within the range of y1 
idxCommonB = find((y2 <= max(y1)) & (y2 >= min(y1))); 
y2c = y2(idxCommonB); 
x2c = x2(idxCommonB); 

% for each point on curve B, find a new x2 that would move the point on 
% curve A 
% We use interp1 function for resample the curve. This function requires 
% all the points in the domain to be unique. So find the unique elements in 
% y1. 
[y1_unique,iUnique] = unique(y1); 
x2c_desired = interp1(y1_unique, x1(iUnique), y2c, 'linear'); 

% find the average distance between the desired and given curves 
x2_logshift = mean(log10(x2c_desired) - log10(x2c)); 

% Display the result 
fprintf('Required shift in log10(x2) is %f.\n', x2_logshift); 
% Required shift in log10(x2) is -0.126954.  

% plot to verify the estimate 
figure; 
plot(log10(x1),y1,'-o') 
hold on 
plot(log10(x2),y2,'-o') 
plot(log10(x2)+x2_logshift,y2,':*') 
grid on; 
legend({'A', 'B', 'Shifted B'}); 
set(gca, 'FontSize', 12); 

results

+0

このソリューションは優れていますが、私はこのプロットに答える必要のある質問はほとんどありません。 1.赤い曲線を青い曲線と重なるようにどれだけシフトする必要がありますか。それは-0.126ですか?シェルそれは負であるか?私はlog10なしでこれを解決できますか? 2. x軸上では、semilogx()関数を使ってグラフを描く必要があります(x軸は明確に表示されます) – Hasan

+0

はい、青色の曲線と一致するように赤色の曲線をlog-domainで-0.126ずらす必要があります。負の符号はシフトが左に向いていることを意味します。私の意見では、シフトはログドメインで実行する必要があります。そうしないと、2つの曲線の一致が悪くなります。最後に、プロットに 'semilogx'を簡単に使うことができます。ログスケールのシフトは、リニアスケールの乗算と同等であることに留意してください。たとえば、シフトされた赤い曲線は、 'semilogx(x2 * 10^x2_logshift、y2)'によってプロットすることができます。 – aksadv

+0

もう一度考えてみてください。私の本当のケースでは。 x軸は判断の数であり、y軸は平均信頼区間である。どのようにして-0.126と判断の数を関連付けることができますか?私は0.126と言うことができます平均的な判断は、BカーブをAカーブと同じ結果にシフトするために必要ですか?それは正しいと思いますか?ありがとう – Hasan

関連する問題