# Why this nonlinear fitting doesn't work?

I have the following data

setA = {{0.0001, 0.5, 0.5000000020621443}, {0.01,
0.9090909090909091, 0.9089263228218556}, {0.1,
0.9803921568627451, 0.9685612823447454}, {1,
0.9951923076923077, 0.8965347385041562}, {10,
0.9975062344139651, 0.8370285555286358}, {1000,
0.9988901220865705, 0.809761243637952}, {10000,
0.9994556341861731, 0.8080295675491966}};

setB = {{0.0001, 0.5, 1.1754907046612933*^-8}, {0.01,
0.9090909090909091, 0.0001497516481925709}, {0.1,
0.9803921568627451, 0.013113265479399906}, {1,
0.9951923076923077, 0.36837218815129213}, {10,
0.9975062344139651, 4.605802823908744}, {1000,
0.9988901220865705, 495.77609116353705}, {10000,
0.9994556341861731, 4985.705218556087}};;


which has the form $$\{\omega, \mu , a \}$$ for setA and $$\{\omega, \mu , b \}$$ for setB. Now I want to fit setA to $$\mu \Bigl(a_1-a_2 \text{erf}(\text{Log}[\omega]\sqrt{a_3 \mu})\Bigl)$$ and fit setB to $$\lvert -b_1 \text{exp}\bigl( b_2 \text{Log}[\omega]\mu+ \frac{\mu \omega}{2} \bigr) \rvert$$ I tried these following codes

fitA = NonlinearModelFit[
setA, \[Mu] (a1 - a2 Erf[Log[\[Omega]] Sqrt[a3 \[Mu]]]), {a1, a2,
a3}, {\[Mu], \[Omega]}]


and

fitB = NonlinearModelFit[setA,
Abs[-b1 Exp[b2 Log[\[Omega]]] \[Mu] + (b3 \[Mu] \[Omega])/2], {b1,
b2, b3}, {\[Mu], \[Omega]}]


but they don't work specially for setA. It returns this error:

NonlinearModelFit::nrlnum: The function value {-0.499987023189+0.0354938976555 I,-0.907628435515+5.02574192093 I,-0.955582409275+31.8756408087 I,-0.766746007804+242.692381728 I,0.46085875147 +4082.71039099 I,128.978969456 +5.26288648114*10^6 I,1297.07927743 +9.21370092281*10^8 I} is not a list of real numbers with dimensions {7} at {a1,a2,a3} = {0.1297887307,987.212217384,-1981.56646201}.


Any idea to fit my data to formula?

I have determined the values of all these parameters using a two-step fitting (first, fit to $$\omega$$ and then fit to $$\mu$$). They have the following values which match to my real data:

$$a_1=0.9,\; a_2=0.096,\; a_3=1.333,\; b_1=0.1,\; b_2=0.5$$

but I want to reproduce them using a one-step fitting to make sure my results were true. In fact this is a cross-checking.

• "They don't work", what error message do you get? Aug 20, 2021 at 5:52
• What do you mean by "your real data"? That is different from setA? Is your "2-step fitting" a recognized fitting technique?
– JimB
Aug 20, 2021 at 17:05
• I meant the correct values of parameters Aug 20, 2021 at 17:28

Add the constraint a3>0

fitA = NonlinearModelFit[setA, {\[Mu] (a1 - a2 Erf[Log[\[Omega]] Sqrt[a3 \[Mu]]]),
a3 > 0}, {a1, a2, a3}, { \[Omega]\[Mu]}]

fitA["BestFitParameters"]
(*{a1 -> 0.905805, a2 -> 0.0872282, a3 -> 2.49084}*)

Show[{ Plot3D[fitA[ \[Omega],\[Mu]], {\[Omega], 0, 10000}, {\[Mu], .5, 1},PlotStyle -> Opacity[.2]], Graphics3D[{Red, Point[setA]}] }]


• Thanks, but why you set $\mu$ from 0 to 10000? it's the range of $\omega$! Aug 20, 2021 at 6:29