我有一堆數據,我想要一個具有我想要的函數的擬合,例如,1/(ax^2+bx+c)
。我的目標是獲得a,b,c值。MATLAB將數據擬合到二次方程式中
有沒有MATLAB的任何功能,幫助這個?我一直在檢查fit()
函數,但我沒有得出結論。哪種方法最好?
我有一堆數據,我想要一個具有我想要的函數的擬合,例如,1/(ax^2+bx+c)
。我的目標是獲得a,b,c值。MATLAB將數據擬合到二次方程式中
有沒有MATLAB的任何功能,幫助這個?我一直在檢查fit()
函數,但我沒有得出結論。哪種方法最好?
你給可以用簡單的方式能夠解決的模型:
% 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
(優化工具箱),fminsearch
或fminunc
編寫您自己的實現。
此外,如果您碰巧有曲線擬合工具箱,請輸入help curvefit
並從那裏開始。
嘿,謝謝!我有個問題。當我的數據用於x和y時,我有下一個我不明白的錯誤:'兩個輸入數組的非單獨維度必須相互匹配。' 此外,我確實有curvefit工具箱,但我無法找到適合我需要的功能,只能使用GUI! (是的,圖形用戶界面使用其他功能,但我迷失在那裏...) –
@AnderBiguri:嗯...似乎你有更多的'y'數據比'x'數據(反之亦然)。你必須看看是否'numel(x)== numel(y)'並檢查是否所有內容都被正確地轉置了。如果'numel(x)〜= numel(y)',那麼......那不是我能解決的問題:) –
@AnderBiguri這可能是bsxfun參數的換位問題。第一個向量應該是一個列向量,第二個向量 - 一個行向量。 – angainor
對我來說,這聽起來像一個最小二乘問題。
我想lsqcurvefit
可能是一個良好的開端:
我不知道這篇文章在3個月後是否有用。 我覺得cftool
可以幫助你 檢查
容易,你可以添加數據,然後選擇擬合方法....
通常要適應功能的數據,而不是周圍的其他方式。 ;)關於函數:你可能會看看'fminunc'和'fminsearch'。 –