Curve Fitting problem

4 次查看(过去 30 天)
Dan
Dan 2012-3-29
So I am trying create a script that create a fit line to a set of data. The trend in the data is most certainly the sum of a sin wave plus a series of exponential functions (two exponentials for a quite good approximation). I have been working on a script to get matlab to calculate the exact function. The script does a fine job at mathcing sin wave however it will not include the exponential part of the function, no matter what guess I put in for the exponential constants matlab returns the same values. Any suggestions on what is wrong or perhaps a better way to make this better? Below I have included two scripts I have written to try and accomplish this, neither worked, also I have tried simply using the cftool and have run into the same problem.
Script 1
x=IGORCurveFit(1:771,1);
y=IGORCurveFit(1:771,6);
plot(x, y, 'ro')
title('BtmPorePressure vs. Time');
xlabel('Time (s)');
ylabel('Pressure (MPa)');
a_guess=.2;
b_guess=.025;
c_guess=.785;
d_guess=5;
e_guess=10;
f_guess=50;
g_guess=100;
h_guess=12;
C0=[a_guess b_guess c_guess d_guess e_guess f_guess g_guess h_guess];
func = @(B,x)(B(1)*sin(B(2)*x+B(3))+B(4)*exp(-(B(5)^2)*x)-B(6)*exp(-((B(7)^2)*x))+B(8));
C = nlinfit(x,y,func,C0);
a_calc = C(1);
b_calc = C(2);
c_calc = C(3);
d_calc = C(4);
e_calc = C(5);
f_calc = C(6);
g_calc = C(7);
h_calc = C(8);
disp('Compare the solutions to the actual values')
fprintf('''a'' actual =%g, a_guess = %.4f\n', a_calc,a_guess);
fprintf('''b'' actual =%g, b_guess = %.4f\n', b_calc,b_guess);
fprintf('''c'' actual =%g, c_guess = %.4f\n', c_calc,c_guess);
fprintf('''d'' actual =%g, d_guess = %.4f\n', d_calc,d_guess);
fprintf('''e'' actual =%g, e_guess = %.4f\n', e_calc,e_guess);
fprintf('''f'' actual =%g, f_guess = %.4f\n', f_calc,f_guess);
fprintf('''g'' actual =%g, g_guess = %.4f\n', g_calc,g_guess);
fprintf('''h'' actual =%g, h_guess = %.4f\n', h_calc,h_guess);
y_new = func(C,x);
hold on
plot (x,y_new)
legend('Raw Data', 'Fitted Curve')
Attempt 2
x=IGORCurveFit(1:771,1);
y=IGORCurveFit(1:771,6);
plot(x, y, 'ro')
title('BtmPorePressure vs. Time');
xlabel('Time (s)');
ylabel('Pressure (MPa)');
%function F = myfun(a,data)
F= @(a,x) (a(1)*sin(a(2)*x+a(3))+a(4)*exp(-(a(5)^2)*x)-a(6)*exp(-((a(7)^2)*x))+a(8));
data = [x;y];
a0 = [.2, .025, .785, 5, 10, 5, 10, 12];
C = lsqcurvefit(F,a0,x,y);
[a,resnorm] = lsqcurvefit(F,a0,x,y)
y_new = F(C,x);
hold on
plot (x,y_new)
legend('Raw Data', 'Fitted Curve')
  3 个评论
Image Analyst
Image Analyst 2012-3-29
Dan, I assume you know most of us don't have IGORCurveFit. I don't even have lsqcurvefit because it's in the optimization toolbox.
Dan
Dan 2012-3-30
Actually finally got the problem solved. Turned out my bounds on my x data were took big for the program to fit the exponential part of the function. Scaled them down and it worked great!
Thanks so much though!

请先登录,再进行评论。

回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Get Started with Curve Fitting Toolbox 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by