Fit an exponential function to time-series data
조회 수: 14 (최근 30일)
이전 댓글 표시
Hi All,
I have a time series data and I would like to fit an exponential curve using the following expression to the data points and estimate the relaxation time B
I saw some examples of curve fitting here https://in.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html . However it is not clear to me how to fit the above function and estimate B. Could someone please help me with this? I would like to find time scale at which C reaches 100 % of C0, C0 = 7.5.
Side note, I've the optimization toolbox and curve fitting tool box installed.
댓글 수: 0
답변 (1개)
Mathieu NOE
2021년 4월 13일
hello
this is the poor man solution without any toolbox
data was stored in txt file
your B = -1/b_sol from my code below
a_sol = 8.3470
b_sol = -0.7241
c_sol = 0.3345
d_sol = -0.8432
numericData = importdata('data.txt');
start = 25; % use data only starting at this index
x = numericData(start:end,1);
y2fit = numericData(start:end,2);
% exponential fit method
% code is giving good results with template equation : % y = a.*(1-exp(b.*(x-c))) + d;
f = @(a,b,c,d,x) a.*(1-exp(b.*(x-c))) + d;
obj_fun = @(params) norm(f(params(1), params(2), params(3), params(4),x)-y2fit);
sol = fminsearch(obj_fun, [y2fit(end)-y2fit(1),0,0,y2fit(1)]);
a_sol = sol(1)
b_sol = sol(2)
c_sol = sol(3)
d_sol = sol(4)
y_fit = f(a_sol, b_sol,c_sol ,d_sol, x);
figure
plot(x,y2fit,'r',x,y_fit,'-.k');
legend('data','exp fit');
댓글 수: 3
Mathieu NOE
2021년 4월 13일
hello again
1/ you see that my fit function has not exactly the same form as yours
I used x as the time variable and the "b" are used differently :
my function : y = a.*(1-exp(b.*(x-c))) + d ;
your function : = a.*(1-exp(-x/B)) ;
we don't care about c and d here , and it's quite obvious now that : B (your formula) = -1/b (mine, and solution in the code once the fit is done , is b_sol);
2/ B is a decay rate - see definition here : Exponential decay - Wikipedia
a very often used relationship : to reach 95% of the asymptote, it takes t = 3 x decay rate = 3 * 1.38 = 4.14 s
theoretically, you never reach 100% (the asymptote) , you can only get very close
참고 항목
카테고리
Help Center 및 File Exchange에서 Interpolation에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!