# Nonlinearmodel Fit, Help needed!

Posted 8 years ago
7739 Views
|
6 Replies
|
0 Total Likes
|
 Hi, I want to fit a sinc function to the data, you can find in the attachment. This is what I've done so far: In[2]:= a245temp = Import["Desktop/A245_temp.txt", "Table"]; In[95]:= ListPlot[a245temp, PlotRange -> All, Frame -> {True}]  In[51]:= model = P*Sin[a (t - T)]^2/(a (t - T)) + m*t + Q Out[51]= Q + m t + (P Sin[a (t - T)]^2)/(a (t - T)) In[92]:= SincFit = NonlinearModelFit[a245temp, model, {{P, 40}, {a, .6}, T, {m, -0.012}, {Q, 1.8}}, t] // Normal Out[92]= -51.8742 + 1.48008 t + ( 580.662 Sin[0.448411 (2.70343 + t)]^2)/(2.70343 + t) But the fit does not work, as you can see here: In[94]:= Plot[SincFit, {t, 27, 40}] Can someone hepl me please? Attachments:
6 Replies
Sort By:
Posted 8 years ago
 Jim, Good question! I don't know the details of how the data was obtained, but you get a Sinc function if you Fourier transform a rectangle: rectangle function. However if the rectangle is somehow modified by some smoothing function, the resulting transform has a main lobe that is typically wider but has smaller side lobes. Also as this seems to be a measurement, you have background noise that can drown out the lower lobes, which is defined by the signal to noise ratio.I agree, from the first post I too thought we are dealing with something like a Gaussian distribution, but obviously from the type of measurement a Sinc function is expected.
Posted 8 years ago
 I confess that I didn't know of the Sinc function and incorrectly assumed it was a misspelling. Sorry about that.However, given that the data does not share the characteristics of the fitted curve (the oscillations on either side of the peak are larger than what is displayed in the data), does this give evidence that the "expected" curve form shouldn't be expected or that the measurement instrument doesn't pick up the expected oscillations? Or something else?Yes, this is not a Mathematica question but I ask because this is part of the complete process of fitting curves to data. FindFit uses least-squares for which inferences about the parameters and predictions depends on or assumes independent random errors of constant variance. It appears that the residuals are highly correlated and/or the curve form is not adequate to describe the observed data.
Posted 8 years ago
 Hi, This is how I would solve it: In[270]:= Clear["Global*"] In[271]:= data = {{27, 2.2}, {27.2, 2.2}, {27.4, 2.3}, {27.6, 2.3}, {27.8, 2.2}, {28, 2.2}, {28.2, 2.3}, {28.4, 2.2}, {28.6, 2.2}, {28.8, 2.3}, {29, 2.2}, {29.2, 2.2}, {29.4, 2.3}, {29.6, 2.2}, {29.8, 2.3}, {30, 2.3}, {30.2, 2.3}, {30.4, 2.3}, {30.6, 2.3}, {30.8, 2.3}, {31, 2.3}, {31.2, 2.3}, {31.4, 2.3}, {31.6, 2.3}, {31.8, 2.3}, {32, 2.3}, {32.2, 2.3}, {32.4, 2.3}, {32.6, 2.3}, {32.8, 2.4}, {33, 2.4}, {33.2, 2.4}, {33.4, 2.4}, {33.6, 2.5}, {33.8, 2.6}, {34, 2.7}, {34.2, 2.7}, {34.4, 2.8}, {34.6, 3.5}, {34.8, 5.1}, {35, 10.3}, {35.2, 15.4}, {35.4, 21.1}, {35.6, 29.1}, {35.8, 35.6}, {36, 38.4}, {36.2, 37.5}, {36.4, 32.8}, {36.6, 25.5}, {36.8, 17.5}, {37, 10.9}, {37.2, 6.4}, {37.4, 3.8}, {37.6, 2.8}, {37.8, 2.7}, {38, 2.9}, {38.2, 2.8}, {38.4, 2.7}, {38.6, 2.4}, {38.8, 2.3}, {39, 2.3}, {39.2, 2.4}, {39.4, 2.4}, {39.6, 2.4}, {39.8, 2.4}, {40, 2.3}}; In[272]:= \ (*pd=ListLogPlot[data,PlotStyle\[Rule]Red,PlotTheme\[Rule]"Detailed"]*) In[273]:= nlm = FindFit[data, pp (Sinc[a x - tt])^2 + q, {a, pp, tt, q, m}, x, Method -> NMinimize] Out[273]= {a -> -1.9653, pp -> 35.9368, tt -> -70.833, q -> 2.05044, m -> -35.6927} In[274]:= fitx[x_] = pp (Sinc[a x - tt])^2 + q /. % Out[274]= 2.05044 + 35.9368 Sinc[70.833 - 1.9653 x]^2 In[275]:= (*fitp=LogPlot[fitx[x],{x,27,40},PlotStyle\[Rule]Green]*) In[276]:= (*Show[pd,fitp]*) I modified your equation took out the "m x" term and I used Sinc^2 instead Sin^2/x (not the same as Sin^2/x^2) not sure if you wanted that. "Method -> NMinimize" does the trick for this kind of fit. this is what I get:
Posted 8 years ago
 Hey, thank you very much. That's perfect! Yes there was indeed an error in my formula, i wanted the sinc^2-function.
Posted 8 years ago
 NonlinearModelFit is probably working just fine. It's your model using a sine wave that's the problem. While the points show a definite peak that isn't the shape of a sine wave (which has a peak and a trough and repeats) although if you restricted your fit of a sine to about 35 to 37, you might do better.If you're mainly interested in approximating the curve (in Mathematica and not outside of Mathematica), then I recommend using the Interpolation function: data = {{27, 2.2}, {27.2, 2.2}, {27.4, 2.3}, {27.6, 2.3}, {27.8, 2.2}, {28, 2.2}, {28.2, 2.3}, {28.4, 2.2}, {28.6, 2.2}, {28.8, 2.3}, {29, 2.2}, {29.2, 2.2}, {29.4, 2.3}, {29.6, 2.2}, {29.8, 2.3}, {30, 2.3}, {30.2, 2.3}, {30.4, 2.3}, {30.6, 2.3}, {30.8, 2.3}, {31, 2.3}, {31.2, 2.3}, {31.4, 2.3}, {31.6, 2.3}, {31.8, 2.3}, {32, 2.3}, {32.2, 2.3}, {32.4, 2.3}, {32.6, 2.3}, {32.8, 2.4}, {33, 2.4}, {33.2, 2.4}, {33.4, 2.4}, {33.6, 2.5}, {33.8, 2.6}, {34, 2.7}, {34.2, 2.7}, {34.4, 2.8}, {34.6, 3.5}, {34.8, 5.1}, {35, 10.3}, {35.2, 15.4}, {35.4, 21.1}, {35.6, 29.1}, {35.8, 35.6}, {36, 38.4}, {36.2, 37.5}, {36.4, 32.8}, {36.6, 25.5}, {36.8, 17.5}, {37, 10.9}, {37.2, 6.4}, {37.4, 3.8}, {37.6, 2.8}, {37.8, 2.7}, {38, 2.9}, {38.2, 2.8}, {38.4, 2.7}, {38.6, 2.4}, {38.8, 2.3}, {39, 2.3}, {39.2, 2.4}, {39.4, 2.4}, {39.6, 2.4}, {39.8, 2.4}, {40, 2.3}}; f = Interpolation[data]; Plot[f[x], {x, 27, 40}, PlotStyle -> Red, PlotRange -> Full];pPoints = ListPlot[data, PlotRange -> Full, PlotStyle -> Blue]; Show[{pInterpolation, pPoints}] But if you need a curve form with parameters to estimate so that you can use the predictions outside of Mathematica (and for which you can decide visually if the fit is good enough), then you might want to try something like pNormalCurve = Plot[2.1 + 55 PDF[NormalDistribution[36.05, 0.6], x], {x, 27, 40}, PlotRange -> Full, PlotStyle -> {Thickness[0.02], LightGray}]; Show[{pNormalCurve, pInterpolation, pPoints}, ImageSize -> Large] `where the thick gray line is the normal curve fit. (I just did this by eye but you can use NonlinearModelFit also.)If you need so say something about the parameters (i.e., measures of precision) and/or prediction errors, then something appropriate (in my opinion) depends on how the data is generated, if there will be multiple data sets which a need to compare parameters, how the residuals look, etc.
Posted 8 years ago
 Hey Jim, thank you for your reply. I'm sry but i didn't describe my problem properly. The data is from a measurement of the power of a laser as a function of the temperature of a crystal. The expected dependency is the sinc-function, i used for my fit-model. I wanted to show something like this:This is done with gnu-plot. I wanted to use mathematica to get a similar result. Thank you!