Re: Re: Strange behaviour of NMinimize when doing curve fitting
- To: mathgroup at smc.vnet.net
- Subject: [mg120743] Re: Re: Strange behaviour of NMinimize when doing curve fitting
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Mon, 8 Aug 2011 04:21:23 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
The error sum has a large constant denominator (use Together to see it),
so you might do this:
Clear[f, error, errorSum]
f[z_, u_, a_, b_][x_] := z x^-a (1 + x/u)^b;
error[z_, u_, a_, b_][x_, y_] := (f[z, u, a, b]@x - y)^2;
points = {{4.68, 0.156}, {7.63, 0.100}, {10.56, 0.074}, {13.48,
0.061}, {16.55, 0.048}, {20.33, 0.029}, {25.39, 0.023}, {30.28,
0.018}, {36.05, 0.016}, {42.60, 0.016}, {55.49, 0.028}};
weights = {0.2523, 0.4007, 0.5801, 0.6193, 0.6798, 1, 0.7957, 0.5144,
0.37030, 0.1079, 0.0189};
errorSum[z_, u_, a_, b_] =
Numerator@Total[(error[z, u, a, b] @@@ points)*weights];
bestFitVals =
NMinimize[{errorSum[z, u, a, b], Thread[0 < {u, z, a, b}]}, {z, u,
a, b}];
soln[x_] = f[z, u, a, b]@x /. bestFitVals[[2]]
(0.818574 (1 + 2.53907 x)^2.72706*10^-26)/x^1.04706
limits = Flatten@{x, Through[{Min, Max}@points[[All, 1]]]};
Show@{Plot[soln@x, Evaluate@limits, PlotRange -> All],
ListPlot[points, PlotStyle -> Red]}
Bobby
On Sun, 07 Aug 2011 05:15:03 -0500, Peter Pein <petsie at dordos.net> wrote:
> Am 06.08.2011 08:14, schrieb Hovhannes Babayan:
>> Hello,
>>
>> I want to fit a set of points with some curve, which form I know, but
>> coefficients have to be determined to make the best possible fit. Also,
>> for the each point a weight (a number ranging from 0 to 1) is defined.
>> Point with greater weight is more important and point with lower weight
>> is not so important. Point with weight=0 doesn't matter at all, point
>> with weight=1 is extremely important.
>> The code below uses NMinimize and draw the best fit graphic.
>> The function f[r_, z_, u_, a_, b_] is a fitting function, where z,u,a,b
>> are parameters.
>> The question is following. Notice that I've used a/110 and b/100,
>> instead of just a and b. When I use just a and b, produced curve
>> doesn't fit at all my points. When I use a/50 and b/50 result is
>> better, with a/70 and b/70 even better, and so on. The best seems to be
>> a/110 and b/100 combination. Why it is so important for NMinimize??
>>> From theoretical point of view it absolutely doesn't matter what is
>>> used: a/100 or a/1000 or just a. Parameter "a" should be found in
>>> every case.
>> Please, if you have met such behavior, let me know, because currently I
>> am doing NMinimize of NMinimize just to find good values to divide a
>> and b, and it has no sense :)
>> In order to try the code below, just copy/paste it into Mathematica, it
>> should print best fit result (first element is error, second element is
>> array with values of parameters z,u,a,b), should plot points and
>> fitting curve. Use a/1 and b/1 to have the worst result and a/110 and
>> b/100 to have good result.
>> Thanks forehand for any suggestions, remarks and/or ideas.
>>
>>
> ...
>
> Hi,
>
> as you can see in this notebook [1], there is no more difference in the
> results, when rationalizing the input and restricting u to be positive
> and the other variables to be nonnegative.
>
> hth,
> Peter
>
>
> [1] http://dl.dropbox.com/u/3030567/Mathematica/hovhannes.nb
>
--
DrMajorBob at yahoo.com