matlab練習程序(修正指數曲線擬合)


對於一般的指數曲線如: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為小數時:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM