2014-10-30 112 views
1

我試圖擬合曲線使用nlinfit,但是,我有3個未知數。MATLAB nlinfit具有多個未知數

我試圖擬合的等式是管中的層流速度曲線。

u = umax(1 - (r/R)^2),其中u是速度,umax是中心線速度,r是從中心線的距離和R是管的半徑。

問題是umaxrR是未知數。

http://www.mne.psu.edu/cimbala/learning/fluid/CV_Momentum/pipe_eg.gif enter image description here

從上述圖像中,中心線是軸。我已經包括碼1組數據:

clc 
clear all 

XMean = [0.13518 
0.1599 
0.17035 
0.18053 
0.18849 
0.19577 
0.19373 
0.18781 
0.17245 
0.15728 
0.13404 
0.10981]; 

r = [-5.5000 
    -4.5000 
    -3.5000 
    -2.5000 
    -1.5000 
    -0.5000 
    0.5000 
    1.5000 
    2.5000 
    3.5000 
    4.5000 
    5.5000]; 

plot(XMean, r) 

我不知道如何格式化式手柄:

Eqn = @(u,y) u(1).*(1 - ((u(2) - y)/u(3)).^2); 

[ beta, R, J, CovB, MSE ] = nlinfit(YMean, r, Eqn, Alpha); 

我希望得到任何幫助試圖將這些數據。謝謝你的時間。

回答

3

爲了計算rmse,每個x值最多有1個y值是必要的,在數學上講是一個「函數」。您可以稍後以草圖顯示它的方式繪製。但是對於計算:旋轉90度。

爲了優化,您需要initiall猜測(您的Alpha),這是未定義的。但是,通過對以下代碼進行一些細微更改,可以獲得最佳參數。另外它可能會更好的可讀性。情節如下所示。

plot(r, XMean ,'ko', 'markerfacecolor', 'black') % // need a "function" (max 1y value for 1x-value) 
Eqn = @(par, x) par(1).*(1 - ((par(2) - x)/par(3)).^2); 
par0 = [1, 1, 1]; % // an initial guess as start for optimization 
par_fit = nlinfit(r, XMean, Eqn, par0); % // optimize 
hold on 
r_fit = linspace(min(r), max(r)); % // more points for smoother curve 
plot(r_fit, Eqn(par_fit, r_fit), 'r') 

enter image description here 的最佳參數我得到退換

par_fit = 

    0.1940 -0.4826 9.0916 

你可能想再次旋轉情節讓它進入正確的方向,在您的草圖。

附加信息:polyfit()代替nlinfit

由於一個可以解析地計算這個流量剖面,一個提前是爲拋物線知道。您也可以使用polyfit來擬合拋物線。

par_poly_fit = polyfit(r, XMean, 2) 

% // it yields the values: 
par_poly_fit = 

-0.0023 -0.0023 0.1934 

繪製該paraobla給出了一個線非常的路線,這是我們與優化得到了相同的,但由於它不依賴於初始值,這只是更穩定。

plot(r_fit, polyval(par_poly_fit, r_fit),'g--' 
+0

出於好奇,爲什麼我需要旋轉圖表以適應曲線? – Cyrus 2014-10-30 21:38:07

+0

因爲你正在定義一個擬合函數''Eqn''。該擬合函數將爲1個輸入值+參數返回1個值。考慮我的情節,例如對於值-4,擬合函數返回類似0.16的東西。但如果情節是旋轉的呢?如果我要放入0.16和參數,擬合函數會返回x軸上的哪個值?它應該返回-4還是+ 4? – Nras 2014-10-31 07:46:54