2012-10-19 103 views
1

我有一堆數據,我想要一個具有我想要的函數的擬合,例如,1/(ax^2+bx+c)。我的目標是獲得a,b,c值。MATLAB將數據擬合到二次方程式中

有沒有MATLAB的任何功能,幫助這個?我一直在檢查fit()函數,但我沒有得出結論。哪種方法最好?

+2

通常要適應功能的數據,而不是周圍的其他方式。 ;)關於函數:你可能會看看'fminunc'和'fminsearch'。 –

回答

5

你給可以用簡單的方式能夠解決的模型:

% model function 
f = @(a,b,c,x) 1./(a*x.^2+b*x+c); 

% noise function 
noise = @(z) 0.005*randn(size(z)); 

% parameters to find 
a = +3; 
b = +4; 
c = -8; 

% exmample data 
x = -2:0.01:2; x = x + noise(x); 
y = f(a,b,c, x); y = y + noise(y); 


% create linear system Ax = b, with 
% A = [x² x 1] 
% x = [a; b; c] 
% b = 1/y; 
A = bsxfun(@power, x.', 2:-1:0); 

A\(1./y.') 

結果:

ans = 
3.035753123094593e+00 % (a) 
4.029749103502019e+00 % (b) 
-8.038644874704120e+00 % (c) 

這是可能的,因爲模型喲你給是線性的,在這種情況下,運營商反斜線會給出解決方案(該1./y是有點危險,雖然...)

當配件 - 線性模型,看看lsqcurvefit(優化工具箱),或者您可以使用fmincon(優化工具箱),fminsearchfminunc編寫您自己的實現。

此外,如果您碰巧有曲線擬合工具箱,請輸入help curvefit並從那裏開始。

+0

嘿,謝謝!我有個問題。當我的數據用於x和y時,我有下一個我不明白的錯誤:'兩個輸入數組的非單獨維度必須相互匹配。' 此外,我確實有curvefit工具箱,但我無法找到適合我需要的功能,只能使用GUI! (是的,圖形用戶界面使用其他功能,但我迷失在那裏...) –

+0

@AnderBiguri:嗯...似乎你有更多的'y'數據比'x'數據(反之亦然)。你必須看看是否'numel(x)== numel(y)'並檢查是否所有內容都被正確地轉置了。如果'numel(x)〜= numel(y)',那麼......那不是我能解決的問題:) –

+1

@AnderBiguri這可能是bsxfun參數的換位問題。第一個向量應該是一個列向量,第二個向量 - 一個行向量。 – angainor

-1

我不知道這篇文章在3個月後是否有用。 我覺得cftool可以幫助你 檢查

容易,你可以添加數據,然後選擇擬合方法....