2012-02-06 54 views
2

這是關係到how to find out the scaling factors to match two curves in matlab? 我用下面的代碼找出縮放因子來匹配兩條曲線找出縮放因子在Matlab配合fmincon兩條曲線

function err = sqrError(coeffs, x1, y1, x2, y2) 
    y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1); 
    err = sum((coeffs(2)*y2sampledInx1-y1).^2); 
end 

,我的後續問題使用fmincon來優化結果。

options = optimset('Algorithm','active-set','MaxFunEvals',10000,'TolCon',1e-7) 
A0(1)=1; A0(2)=1; LBA1=0.1; UBA1=5; LBA2=0.1; UBA2=5; 
LB=[LBA1 LBA2]; UB=[UBA1 UBA2]; 
coeffs = fmincon(@(c) sqrError(c,x1, y1, x2, y2),A0,[],[],[],[],LB,UB,[],options); 

當我和與該功能數據測試,

X1 = [ - 0.3 -0.24 -0.18 -0.12 -0.06 0.06 0.12 0.18 0.24 0.3 0.36 0.42 0.48 0.54 0.6 0.66 0.72 0.78 0.84 0.9 0.96 1.02 1.08 1.14 1.2 1.26 1.32 1.38 1.44 1.5 1.56 1.62 1.68 1.74 1.8 1.86 1.92 1.98 2.04] Y1 = [0.00 0.00 0.00 0.01 0.03 0.09 0.13 0.14 0.14 0.16 0.20 0.22 0.26 0.34 0.41 0.52 0.62 0.72 0.81 0.91 0.95 0.99 0.98 0.96 0.90 0.82 0.74 0.66 0.58 0.52 0.47 0.40 0.36 0.32 0.27 0.22 0.19 0.15 0.12 0.10];

X2 = [ - 0.3 -0.24 -0.18 -0.12 -0.06 0.06 0.12 0.18 0.24 0.3 0.36 0.42 0.48 0.54 0.6 0.66 0.72 0.78 0.84 0.9 0.96 1.02 1.08 1.14 1.2 1。26 1.32 1.38 1.44 1.5 1.56 1.62 1.68 1.74 1.8 1.86 1.92 1.98 2.04]; Y2 = [0.00 0.00 0.00 0.00 0.05 0.15 0.15 0.13 0.11 0.11 0.13 0.18 0.24 0.33 0.43 0.54 0.66 0.76 0.84 0.90 0.93 0.94 0.94 0.91 0.87 0.81 0.75 0.69 0.63 0.55 0.49 0.43 0.37 0.32 0.27 0.23 0.19 0.16 0.13 0.10 ]。

錯誤消息顯示爲如下:

???使用錯誤==> interp1在172的NaN不在2 y2sampledInx1 = interp1(coeffs(1)* X2,Y2,X1)爲 X.

誤差在==> sqrError一個適當的值;

錯誤==> @(c)中sqrError(C,X1,Y1,X2,Y2)

錯誤==> nlconst在805 F = feval(funfcn {3},X, varargin {:});

錯誤==> fmincon在758 [X,FVAL,LAMBDA,EXITFLAG,OUTPUT GRAD,粗麻布] = ...

錯誤==> coeffs = fmincon(@(三)sqrError(C,X1,Y1,X2,Y2 ),A0,[],[],[],[],LB,UB,[],選項);

有什麼不對的代碼,我應該如何避開它。 感謝您的幫助。

回答

2

你的縮放可能推動內插軸出的數據的x軸的範圍。即

X1 <分鐘(X2 * coeffs(1))或X1> MAX(X2 * coeffs(1)),用於通過擬合算法中的至少一種x1和coeffs的值(1)

您可以通過給外推值範圍之外的數據解決這個問題。或者,你可以使用外插在這些數值猜測。因此,嘗試這些

y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1,'Linear', 'Extrap'); 
y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1,'Linear', Inf); 
y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1,'Linear', 1E18); %if Inf messes with the algorithm 
+0

@馬克一個,感謝您的快速答覆。我嘗試了你提供的外插方法,它顯示了下面的錯誤消息:「???錯誤使用==> interp1在344無效方法。」你有其他建議嗎? – tytamu 2012-02-06 21:07:43

+0

@泰,馬克的解決方案是正確的,對我來說工作得很好。您看到的問題是由於Marc最後一行('Lienear')中的簡單拼寫錯誤造成的。無論如何,你不需要指定插值的方法。在你的代碼中,我用'y2sampledInx1 = interp1(coeffs(1)* x2,y2,x1,[],'extrap');替換了'y2sampledInx1 = interp1(coeffs(1)* x2,y2,x1)並沒有問題。 – foglerit 2012-02-07 01:42:06

+0

@ jonnat和Marc,感謝您的幫助。它現在很好用! – tytamu 2012-02-07 02:50:45