2012-12-17 117 views
0

我試圖用F(x)= 1 /(ax^2 + bx + c)的形式來擬合一些逆拋物線。擬合反拋物線。不能達到最小二乘法解析表達式

我的目標是在C++中編寫一個函數,該函數需要一組10-30個點,並將它們擬合到反演拋物線。

我開始嘗試使用最小二乘法獲得解析表達式,但無法獲得結果。我嘗試了手工(有點瘋狂),然後我試着解析a,b和c的表達式,但是mupad並沒有給我一個結果(我對Matlab的mupad很新穎,所以也許我沒有做到這一點) 。 我不知道如何解決這個問題。

我可以得到這個特定問題的解析表達式嗎?我也看到了一般最小二乘擬合的算法,但我不需要一個如此複雜的算法,我只需要它用於這個等式。 如果不是,StackOverflow人員將如何解決問題?

如果需要,我可以發佈公式和我嘗試過的小型Mupad代碼,但我認爲是不必要的。

編輯:一些例子

對不起形象是有點混亂,但它是我需要的東西。 數據呈藍色(此數據特別嘈雜)。我只需要使用垂直線之間的數據(左邊的一堆數據和右邊的一堆數據)。

適合的結果是在紅線。

所有這些都是用matlab編寫的,但我需要用C++編寫。

我會嘗試發佈的一些數據...

enter image description here

編輯2:我居然做了件在Matlab如下(不實際的代碼):

create linear system Ax = b, with 
A = [x² x 1] 
x = [a; b; c] 
b = 1/y; 

它應該工作,不是嗎?我可以用SVD計算Moore-Penrose pseudoinv求解。不是嗎?

+0

因此,考慮到3雙'(X,Y)'你需要計算'了''B'和'C'? – Lol4t0

+0

實際上給了n對(x,y)! @ Lol4t0 –

+0

這不是一個編程問題,這是一個數學/統計問題。這就是說,只有*線性*最小二乘有解析解。非線性最小二乘需要數值方法。 –

回答

2

沒有最小二乘法的解析解;這是一個最小化問題,需要聰明的迭代方法來解決。 (非線性LS - 謝謝@insilico)

你可以試試牛頓風格的迭代方法(通過重新排列方程),但我不認爲它會很容易地收斂你的函數 - 這將在兩個高度非線性分!

我建議使用這個庫。如內爾德 - 米德搜索

http://www.codecogs.com/code/maths/optimization/nelder.php

您只需提供您的錯誤功能 - 這是

sum(pow(F(x) - dataY(x), 2)) 

,並提供一組初始值(在該解決方案在黑暗中刺); 我用nelder-mead取得了很好的成功。

我不認爲你會找到一個很好的純編碼的解決方案。

+0

好,病檢查,但實際上,你可以很容易地得到一些最小二乘法的anallytical的解決方案,它是有summatories(所以迭代)一analyticall解決方案,但它仍然是一個anallitical的解決方案。我已經編程了一些最小二乘。 –

+0

@AnderBiguri你說得很對,我忘了寫'非線性'。你確實可以做一個正常的拋物線,因爲它是[1,x,x^2]的線性組合。 –

+0

哦,但你發佈的nelder函數是商業的...我需要使用免費代碼。我會嘗試檢查更多 –

1

如果我理解正確的話,你只需要知道一個擬合公式爲特定的數據集,對不對?

如果是這樣,那麼你只需要得到一個曲線擬合程序,並使用所需的方法擬合曲線。然後,執行曲線擬合顯示的公式。

有幾個曲線擬合計劃在那裏:

曲線專家

http://www.curveexpert.net/

* Eurequa *

http://creativemachines.cornell.edu/eureqa

此外,索姆電子表格軟件包可能會有您需要的曲線擬合設施。

我會很樂意嘗試做一個適合你,如果你提供的數據。沒有保證讓你想要的合適。

+0

謝謝,我會檢查他們。我可以給你擬合的數據,但是它或多或少是一個鐘形曲線(可以用反拋物線方程表示)和一些隨機噪聲。沒有什麼奇怪的。 –

+0

@AnderBiguri:沒關係。如果上述內容不符合您的需求,請告訴我。請記住,我的適應性將嘗試將其插入到CurveExpert中,如果它對數據不滿意,最多隻能進行一次中間「按摩」。 – RonaldBarzell

+0

對不起,我們誤解了。我不需要特定集合的數據,我需要一個擬合算法。數據將從測試到測試沒有太大的不同,但我仍然需要一個概括。 –