2014-10-28 78 views
0

我有一組x和y值,我想要擬合一個多項式曲線。函數應該採用高達9階多項式的形式;matlab優化工具箱 - 多項式擬合

y = a(1)*X.^1 + a(2)*X.^2 + a(3)*X.^3 + a(4)*X.^4 + a(5)*X.^5 + a(6)*X.^6 + a(7)*X.^7 + a(8)*X.^8 + a(9)*X.^9;

其中a(n)爲我的係數。

我有兩個問題。該曲線可能並不總是採用9階多項式的形式。它可能是一個3階,6階或其他任何東西(最多9階)。

我不確定如何使用優化工具箱進行設置。有任何想法嗎?

其次,我可以設置一個約束,以便計算的y值總是正的嗎?

非常感謝,

當前代碼在下面。

功能;

function F = polyfun(a,redCO2) 
 
F = a(1)*redCO2.^1 + a(2)*redCO2.^2 + a(3)*redCO2.^3 + a(4)*redCO2.^4 + a(5)*redCO2.^5 + a(6)*redCO2.^6 + a(7)*redCO2.^7 + a(8)*redCO2.^8 + a(9)*redCO2.^9;

F = @(a) polyfun(a,X); 
 

 
a0 = [100, 100, 100, 100, 100, 100, 100, 100, 100]; % Starting guess 
 

 
a = lsqcurvefit(@polyfun,a0,X,y);

+0

道歉,它說:redCO2 – user3491279 2014-10-28 21:05:25

+1

如果您可以訪問它的功能代碼應爲X,曲線擬合工具箱大概會做一個更好的工具來用於你想要做的事情。 – MrAzzaman 2014-10-28 21:09:24

回答

2

您有兩個單獨的請求。

對於不受約束的配合,你不需要任何功能可言,問題是線性的,mrdivide和/或pinv給出了最小二乘意義上的最佳擬合:

a = y/bsxfun(@power, x, 1:9); 

a = y * pinv(bsxfun(@power, x, 1:9)); 

如果系統欠約束,其中一個將給出一個在l2範數意義上的「小」解,另一個在l0範數意義上。如果系統完全或過度受限,則它們都會給出值a,使積分平方誤差(l2-範數)最小化。

對於約束擬合,您已經發現的lsqcurvefit函數效果很好。只需設置lb參數零向量強迫a是非neqgative:

a = lsqcurvefit(@polyval,a0,X,y,zeros(1,9)); 
+0

非常感謝 - 這解決了我的第二個問題。乾杯! – user3491279 2014-10-28 22:33:50

1

只需使用polyfit,這正是它被設計爲:

% Data you want to fit in x and y 
% n is the polynomial order of your choosing 
% the polynomial coefficients are returned in the vector p 
p = polyfit(x,y,n); 

然後可以使用polyval用於評估x值的矢量上的多項式p

+0

感謝您的幫助。然而,在每種情況下,我都不知道「n」是什麼。因此,我想使用優化工具箱。 – user3491279 2014-10-28 21:24:07

+0

如果您不知道度數,您如何期望找到多項式係數?你可以嘗試各種方法並使用'[p,S] = polyfit(x,y,n)'語法,該語法也返回一個結構體'S',它會告訴你更多關於擬合度的信息。檢查文檔。 – am304 2014-10-28 21:26:58

+1

@ user3491279:使用'n = 9',最大訂單。如果低階多項式更好,則可以在答案中得到零。 – 2014-10-28 21:29:35