對於一般的指數曲線如:y=a*e^(k*t),可以先對兩邊求對數得到:log(y) = log(a)+k*t 這樣的曲線,然后用最小二乘來計算系數。
但是對於修正指數曲線如:y=k+a*b^t 這樣的函數,沒法直接求對數然后用最小二乘,因為有一個常數項k,這里可以利用三和法來計算系數。
對於曲線 y = k+a*b^t,三和法計算各系數公式如下:
其中:
其中:
m=n/3,這里的n就是所有數據的總個數。
這種方法不止可以計算形如y = k+a*b^t這樣的修正指數曲線,還可以計算形如y=k*a^(b^t)這樣的compertz曲線和形如y=1/(k+a*b^t)這樣的logistic曲線,因為compertz曲線可以通過求log得到修正指數曲線,而logistic曲線可以通過求倒數得到修正指數曲線。
matlab代碼如下:
clear all; close all; clc; a=45.73423; b=0.4234; k=34.34534; t=1:30; %t為整數沒問題 t=1:0.1:30; %t為小數有問題,只能求出k y=k+a*b.^t; plot(t,y); m=floor(length(t)/3); S1 = sum(y(1:m)); S2 = sum(y(m+1:2*m)); S3 = sum(y(2*m+1:3*m)); b = ((S3-S2)/(S2-S1))^(1.0/m); a = (S2-S1)*(b-1)/(b*(b^m-1)^2); k = (1.0/m)*(S1 - a*b*(b^m-1)/(b-1)); y1=k+a*b.^t; hold on; plot(t,y1,'ro'); newy = y - k; %log(newy) = log(a) + log(b)*t; X = [t' ones(length(t),1)]; Y = log(newy)'; C = inv(X'*X)*X'*Y; a = exp(C(2)); b = exp(C(1)); y=k+a*b.^t; hold on; plot(t,y,'r.');
對於上面的程序,有一點需要注意,當t為整數變化時,該方法求得的結果是正確的。
但是當t為小數變化是,該方法直接求得的a和b是錯誤的,但是k是正確的,有了k,同樣可以利用最小二乘計算出a和b。
結果如下:
當t為整數時:
當t為小數時: