
How to curve fitting a cosine function with exponential decay tau?
조회 수: 13 (최근 30일)
이전 댓글 표시
Hello,
I am new to MATLAB and I dont know how to fit a consine function. I have my data points and this is the function that I need to fit. I want to know the values of T, phi, and tau. How can I do that? If anyone could provide some insights, that would be greatly appreiciated!

This is my data for time and amplitude
x =
0.1167
0.2833
0.3333
0.3833
0.4250
0.4500
0.4917
0.5167
0.5500
0.6000
0.6333
0.6667
0.7167
0.7500
0.8167
0.9000
1.0667
1.1500
1.2167
1.2667
1.3000
1.3333
1.3667
1.4000
1.4333
1.4667
1.5167
1.5500
1.5833
1.6167
1.7000
1.8500
1.9667
2.0167
2.0667
2.1000
2.1500
2.1833
2.2167
2.2500
2.2833
2.3333
2.3667
2.4000
2.4500
2.5167
2.6833
2.7167
2.7500
2.8167
2.8833
2.9333
2.9667
3.0000
3.0500
3.0833
3.1167
3.1500
3.2000
3.2333
3.2667
3.3333
3.4000
3.5333
3.6167
3.6667
3.7333
3.7833
3.8167
3.8500
3.8833
3.9333
3.9667
4.0000
4.0500
4.0833
4.1333
4.2167
4.3500
4.6500
4.5500
4.6000
4.6500
4.6833
4.7167
4.7500
4.8000
4.8333
4.8833
4.9167
4.9500
5.0167
5.0833
5.2000
5.2667
5.3167
5.4000
5.4333
5.4833
5.5167
5.5500
5.5917
5.6333
5.6833
5.7167
5.7667
5.8167
5.9000
6.0167
6.1333
6.2000
6.2500
6.3000
6.3333
6.3833
6.4167
6.4667
6.5000
6.5500
6.5833
6.6167
6.6833
6.8333
6.9167
6.9833
7.0500
7.0833
7.1333
7.1667
7.2167
7.2500
7.2833
7.3500
7.3833
7.4500
7.5000
7.5833
7.6833
7.7667
7.8333
7.8833
7.9500
7.9833
7.0333
>> y
y =
1.3963
1.2217
1.0472
0.8727
0.6981
0.5236
0.3491
0.1745
0
-0.1745
-0.3491
-0.5236
-0.6981
-0.8727
-1.0472
-1.2217
-1.2217
-1.0472
-0.8727
-0.6981
-0.5236
-0.3491
-0.1745
0
0.1745
0.3491
0.5236
0.6981
0.8727
1.0472
1.2217
1.3963
1.2217
1.0472
0.8727
0.6981
0.5236
0.3491
0.1745
0
-0.1745
-0.3491
-0.5236
-0.6981
-0.8727
-1.0472
-1.2217
-1.3090
-1.2217
-1.0472
-0.8727
-0.6981
-0.5236
-0.3491
-0.1745
0
0.1745
0.3491
0.5236
0.6981
0.8727
1.0472
1.2217
1.3090
1.2217
1.0472
0.8727
0.6981
0.5236
0.3491
0.1745
0
-0.1745
-0.3491
-0.5236
-0.6981
-0.8727
-1.0472
-1.1345
-1.0472
-0.8727
-0.6981
-0.5236
-0.3491
-0.1745
0
0.1745
0.3491
0.5236
0.6981
0.8727
1.0472
1.2217
1.2392
1.2217
1.0472
0.8727
0.6981
0.5236
0.3491
0.1745
0
-0.1745
-0.3491
-0.5236
-0.6981
-0.8727
-1.0472
-1.2043
-1.0472
-0.8727
-0.6981
-0.5236
-0.3491
-0.1745
0
0.1745
0.3491
0.5236
0.6981
0.8727
1.0472
1.2217
1.2217
1.0472
0.8727
0.6981
0.5236
0.3491
0.1745
0
-0.1745
-0.3491
-0.5236
-0.6981
-0.8727
-1.0472
-1.1868
-1.0472
-0.8727
-0.6981
-0.5236
-0.3491
-0.0789
>>
댓글 수: 1
Alex Sha
2020년 10월 6일
Hi, are you sure two pairs of data "4.6500 -1.0472" and "7.0333 -0.0789" are correct?

답변 (1개)
Star Strider
2020년 10월 6일
Try this:
y = detrend(y); % Remove Linear Trend
yu = max(y);
yl = min(y);
yr = (yu-yl); % Range of ‘y’
yz = y-yu+(yr/2);
zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Approximate Zero-Crossing Indices Of Argument Vector
zt = x(zci(y));
per = 2*mean(diff(zt)); % Estimate period
ym = mean(y); % Estimate offset
fit = @(b,x) b(1) .* exp(x./b(2)) .* (cos(2*pi*x./b(3) + b(4))) + b(5); % Objective Function to fit
fcn = @(b) norm(fit(b,x) - y); % Least-Squares cost function
[s,nmrs] = fminsearch(fcn, [yr; -10; per; -1; ym]) % Minimise Least-Squares
xp = linspace(min(x),max(x), 500);
figure
plot(x,y,'b', 'LineWidth',1.5)
hold on
plot(xp,fit(s,xp), '--r')
hold off
grid
ylim(ylim*1.5)
xlabel('Time')
ylabel('Amplitude')
legend('Original Data', 'Fitted Curve')
text(0.2*max(xlim),0.7*min(ylim), sprintf('$y = %.3f\\cdot e^{\\frac{t}{%.3f}}\\cdot cos(2\\pi \\frac{t}{%.3f} %+.3f)$', [s(1:2); 1./s(3:4)]), 'Interpreter','latex', 'FontSize',14)
producing:

It is essentially the code in my previous Answer that you already discovered,simply changed to fit your equation.
댓글 수: 2
Star Strider
2020년 10월 6일
My pleasure!
If you have error bars associated with them, use the errorbar function to plot the error bars. Recent releases can plot both x and y error bars, earlier releases can only plot y error bars. (I do not remember the release the x error bars were introduced.)
참고 항목
카테고리
Help Center 및 File Exchange에서 Labels and Styling에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!