MATLAB: What is the best fit for a set of data

best fit equationfit

I have data which represents Dynamic viscosity of a fluid as a function of Temperature. I need a best fit equation like : Dynamic viscosity = (a*Temperature^b) – c. where a, b and c are constant .can any one give the best fit equation.

Best Answer

  • I think you need to spend some time learning about modeling. Do some reading. Lots of stuff online to be found. You would want to consider at some point if a regression style model is really appropriate, or if a simple spline interpolation would be satisfactory. Do you just want a pretty plot? Do you want something you can interpolate with, just to predict viscosity for different temperatures? So you should spend some time deciding what you want, what you need, what are your long term goals in the task at hand.
    Anyway, alot of modeling ends up being common sense. So first, plot your data. Always plot everything. A simple rule that will serve you greatly in the future.
    plot(T,V,'.'), grid on
    Here, I would first recognize that your data varies by several orders of magnitude in Viscosity, but temperature is pretty well-behaved. I would ask questions like is this measured data? What do you expect about the noise structure in your data? Note that any traditional fiit using least squares in the residuals of viscosity will be STRONGLY influenced by only those first few points. Again, this is something you need to learn about modeling. But my point is that IF we look at the data,
    [T,V]
    ans =
    273 0.143
    283 0.0738
    293 0.0416
    303 0.0252
    313 0.0163
    323 0.0111
    333 0.00793
    343 0.00589
    353 0.00452
    363 0.00356
    373 0.00288
    383 0.00238
    393 0.002
    403 0.00171
    413 0.00148
    423 0.00129
    433 0.00114
    443 0.00102
    453 0.000913
    463 0.000825
    473 0.000749
    483 0.000683
    493 0.000625
    503 0.000574
    513 0.000528
    523 0.000488
    533 0.000451
    543 0.000418
    553 0.000387
    563 0.00036
    573 0.000334
    583 0.000311
    593 0.000289
    I would want my curve to fit well down in that tail. Essentially, ypu want to consider if any proportional (relative) errors are appropriate. Most of the time, when your data varies by many orders of magnitude, that is what you will want to see. If so, then it makes complete sense to log the y variable, thus here we would work in terms of log(viscosity). Plot that. Look at it. Think about the curve you see.
    semilogy(T,V,'.')
    grid on
    So here we see a relationship that is far more well-behaved. I don't see much noise in the data. So a simple interpolation would do well here. In fact, you need to consider if it may well be the best choice, since any simple model will have considerable lack of fit! So again, what do you need out of this in the end? A pretty picture? A function that you can write down, even if it misses passing through the data very well? What do you need?
    Next, IF you would consider a simple model like
    viscosity = A*temp^B
    then a log-log plot would give a straight line fit. (Note that I ignored for the moment the constant offset term C that you posed.)
    loglog(T,V,'.'), grid on
    So it gave us something closer to a straight line. In fact, a little play would convince you that no value of C will make this curve a straight line. That is, there is no value of C such that
    loglog(T,V - C ,'.')
    would yield something close to a straight line. This is something you can prove rather easily. (Think about it.)
    So the model you posed, of
    viscosity = A*temp^B + C
    is simply not a good choice.(You actually had it where you subtracted C, but that is simply a sign chance on the value of C: so completely irrelevant.)
    Instead, try this plot, and think about what it means:
    loglog(T - 250,V,'.'), grid on
    I just picked a number out of thin air, assuming these were temperatures in degrees Kelvin.
    Note how the relationship is now very near a straight line. That suggests a good choice of model might be something like
    viscosity = A*(temp - t0)^B
    where t0 is on the order of 250, so around -20 degrees C.
    So we might decide to fit a model of that form instead. Again, you very much want to do that fit on the log of viscosity. If we log that model, we will have:
    log(viscosity) = log(A) + log(temp - t0)*B
    I'll assume the curve fitting toolbox here, and with some not unreasonable guesses for the parameters, we see this:
    ft = fittype('log(A) + log(temp - t0)*B','independent','temp','coefficients',{'A','B','t0'})
    General model:
    ft(A,B,t0,temp) = log(A) + log(temp - t0)*B
    mdl = fit(T,log(V),ft,'start',[100,-1,250])
    mdl =
    General model:
    mdl(temp) = log(A) + log(temp - t0)*B
    Coefficients (with 95% confidence bounds):
    A = 234.9 (123.2, 346.5)
    B = -2.339 (-2.423, -2.255)
    t0 = 250.6 (247.8, 253.5)
    plot(mdl)
    hold on
    plot(T,log(V),'o')
    grid on
    xlabel 'Temp, degrees K'
    ylabel 'log(viscosity)'
    So not terrible. Stil some lack of fit, just a wee bit. A spline interpolant will nail the shape of the curve exactly.
    But only you know why you need to do this curve fit. Does a model offer you some understanding of the process? With some thought, you could probably do a little better job yet. What you should understand here is the model I derived came from simply looking at the data, then applying a little common sense to the modeling. And plot everything.