Re: NonlinearRegress and numerical functions...
- To: mathgroup at smc.vnet.net
- Subject: [mg20253] Re: [mg20132] NonlinearRegress and numerical functions...
- From: Mike Trefry <mike.trefry at per.clw.csiro.au>
- Date: Fri, 8 Oct 1999 18:30:24 -0400
- Sender: owner-wri-mathgroup at wolfram.com
I had exactly the same problem several months ago. I could get FindMinimum to work with a function involving NDSolve, but NonlinearRegress would not work properly. Hence I could not use Mathematica to generate confidence intervals on its best-fit parameters for an inverse pde problem. Larske Ragnarsson wrote: > Hi again > Thanks for the help. However as Daniel pointed out, I am trying to use > NonlinearFit/Regress on a function which is rather complex. Since I want > to fit on the parameters which are both involved in the DE AND the integration > I MUST (I think) solve the DE each time. On top of this I must also solve > it numerically since it has no symbolic solutions (which of course would > have trivialized the problem). > Daniel suggested that I use FindMinimum, and it seems to work (I actually > tried this before) but it is very slow and is often unsuccesful, e.g. this > error message turns up now and then: > FindMinimum::regex : > Reached the point 5.5743824908216554`*^23 which > is outside the region {{10^21, 10^25}, {0, 0.2}, {0, 0.2}}. > which as you can see is quite strange :-) Any suggestions on this matter > are of course welcome and appreciated! > Problems most often arise when I try to fit on more than two of the > parameters. > There were also some who mentioned that I would need more data, and > that is true, but since this are real measurements (passivation of defects) > and the measurements take a while to do, this is what I have. Below > are my actual problem again, with the data and FindMinimum call. Last, > there is a mathematica cell expression! > Thanks again for any help!! > > /Larske Ragnarsson > ---------- > Statistics`NormalDistribution` > Statistics`NonlinearFit` > k0[T_,Ef0_]:=1.43 10^-12 E^-(Ef0/8.618 10^-5/T) > k1[T_,Ef1_]:=1.43 10^-12 E^-(Ef1/8.618 10^-5/T) > Pb0H2[t_, T_, Ef0_, Ef1_, H20_, Pb00_, Pb10_] := > (Pb0[t] /. (NDSolve[{Pb0'[t] == -k0[T, Ef0] H2[t]Pb0[t], Pb1'[t] == > -k1[T, Ef1] H2[t]Pb1[t], H2'[t] == -k0[T, Ef0]/tox; H2[t] Pb0[t] > - k1[T, Ef1]/tox H2[t] Pb1[t], Pb0[0] == Pb00, Pb1[0] == Pb10, H2[0] > == H20}, > {Pb0[t], Pb1[t], H2[t]}, {t,0,10000}, MaxSteps -> 100000])[[1]])/Pb00 > Pb0H2p[t_, T_, Ef0_, Ef1_, H20_, Pb00_, Pb10_] := Pb0H2[t0, T, Ef0,Ef1, > H20, Pb00, Pb10] /. {t0 -> t} > Pb0H2DistDouble[t_, T_, Ef0_, sigma0_, Ef1_, sigma1_, H20_, Pb00_, Pb10_]:= > NIntegrate[(Pb0H2p[t, T, Eff0, Eff1, H20, Pb00, Pb10]* PDF[NormalDistribution[Ef0, > sigma0], Eff0]* PDF[NormalDistribution[Ef1,sigma1], Eff1]), {Eff0, > Ef0 - 5sigma0, Ef0 + 5sigma0}, {Eff1, Ef1 - 5sigma1, Ef1 + 5sigma1}, > Method -> Trapezoidal, AccuracyGoal -> 2, PrecisionGoal -> 2] > fittingdata= {{0, 170, 1.}, {100, 170, 1.0007}, {1000, 170, 0.97656}, > {10000, 170, > 0.94368}, {0, 200, 1.}, {100, 200, 0.98866}, {1000, > 200, 0.9525}, {10000, > 200, 0.93537}, {0, 230, 1.}, {100, 230, 0.95589}, > {1000, 230, > 0.92255}, {10000, 230, 0.91}, {0, 260, 1.}, {100, > 260, 0.9215}, {1000, > 260, 0.90957}, {10000, 260, 0.90555}} > NonlinearRegress trial: > ----------------------- > NonlinearRegress[fittingdata, Pb0H2DistSingle[t, T, 1.51, 0.14, > 1.57, 0.15, H20, 1.4 10^16, 1.1 10^16], {t, T}, {H20,{10^23,10^24},10^21,10^25}] > ====> plenty of errors > > FindMinimum trial: > ------------------- > Pb0H2DistDoubleFitMS[Ef0_, sigma0_, Ef1_, sigma1_, H20_, Pb00_, Pb10_] > := > Plus @@ Apply[(Pb0H2DistDoubleFit[#1, #2, Ef0, sigma0, Ef1, > sigma1, H20, Pb00, > > Pb10] - #3)^2 &, fittingdata, {1}] > fit2 = > FindMinimum[ > Pb0H2DistDoubleFitMS[1.51, sigma0, 1.57, > sigma1, H20, 1.4 10^16, > 1.1 10^16], {H20, {5 10^23, > 6 10^23}, 10^21, > 10^25}, {sigma0, {0.1, 0.12}, > 0, 0.2}, {sigma1, {0.1, 0.12}, 0, > 0.2}, AccuracyGoal -> 50, > MaxIterations -> 1000, > WorkingPrecision -> 100] > ====> > FindMinimum::regex : > Reached the point 5.5743824908216554`*^23 which > is outside the region {{10^21, 10^25}, {0, 0.2}, {0, 0.2}}. > > -------------------------------- > Mathematica Expression > -------------------------------- > > Cell[CellGroupData[{ > Cell["Nonlinearfitting", "Subsection"], > Cell[BoxData[{ > \( Statistics`NormalDistribution`\), "\[IndentingNewLine]", > \( Statistics`NonlinearFit`\)}], "Input"], > Cell[BoxData[{ > \(k0[T_, Ef0_] := > 1.43\ 10^\(-12\)\ E^\(-\((Ef0/8.618\ > 10^\(-5\)/ > > T)\)\)\), "\[IndentingNewLine]", > \(k1[T_, Ef1_] := > 1.43\ 10^\(-12\)\ E^\(-\((Ef1/8.618\ > 10^\(-5\)/T)\)\)\)}], "Input"], > Cell[BoxData[{ > \(Pb0H2[t_, T_, Ef0_, Ef1_, H20_, Pb00_, > Pb10_] := \((Pb0[ > > t] /. \((NDSolve[{\(Pb0'\)[t] == \(-k0[T, Ef0]\)\ H2[t] > > Pb0[t], \(Pb1'\)[t] == \(-k1[T, Ef1]\)\ H2[t] > > Pb1[t], \(H2'\)[t] == \(-k0[T, Ef0]\)/tox; \ > > H2[t]\ Pb0[t] - k1[T, Ef1]/tox\ H2[t]\ Pb1[t], > > Pb0[0] == Pb00, Pb1[0] == Pb10, H2[0] == H20}, {Pb0[t], > > Pb1[t], H2[t]}, {t, 0, 10000}, > > MaxSteps -> 100000])\)[\([1]\)])\)/ > Pb00\), "\[IndentingNewLine]", > \(Pb0H2p[t_, T_, Ef0_, Ef1_, H20_, Pb00_, Pb10_] > := > Pb0H2[t0, T, Ef0, Ef1, H20, Pb00, Pb10] > /. {t0 -> t}\)}], "Input"], > Cell[BoxData[ > \(Pb0H2DistDouble[t_, T_, Ef0_, sigma0_, Ef1_, sigma1_, > H20_, Pb00_, > Pb10_] := NIntegrate[\((Pb0H2p[t, > T, Eff0, Eff1, H20, Pb00, Pb10]* > > PDF[NormalDistribution[Ef0, sigma0], Eff0]* > > PDF[NormalDistribution[Ef1, sigma1], Eff1])\), {Eff0, > Ef0 - 5 > sigma0, Ef0 + 5 sigma0}, {Eff1, Ef1 - 5 sigma1, > Ef1 + 5 > sigma1}, Method -> Trapezoidal, AccuracyGoal -> 2, > PrecisionGoal -> 2]\)], > "Input"], > Cell[BoxData[ > \(fittingdata = {{0, 170, 1. }, {100, 170, 1.0007}, > {1000, 170, > 0.97656}, {10000, > 170, 0.94368}, {0, 200, 1. }, {100, 200, > 0.98866}, {1000, > 200, 0.9525}, {10000, 200, 0.93537}, {0, 230, > 1. }, {100, > 230, 0.95589}, {1000, 230, 0.92255}, {10000, 230, > 0.91}, {0, 260, > 1. }, {100, 260, 0.9215}, {1000, 260, > 0.90957}, {10000, > 260, 0.90555}}\)], "Input"], > Cell[BoxData[ > \(NonlinearRegress[fittingdata, > Pb0H2DistSingle[t, T, 1.51, 0.14, 1.57, > 0.15, H20, 1.4\ 10^16, > 1.1\ 10^16], {t, T}, {H20, > {10^23, 10^24}, 10^21, > 10^25}]\)], "Input"], > Cell[BoxData[{ > \(Pb0H2DistDoubleFitMS[Ef0_, sigma0_, Ef1_, sigma1_, > H20_, Pb00_, Pb10_] := > Plus @@ Apply[\((Pb0H2DistDoubleFit[#1, > #2, Ef0, sigma0, Ef1, sigma1, > > H20, Pb00, Pb10] - #3)\)^2 &, > fittingdata, > {1}]\), "\[IndentingNewLine]", > \(fit2 = > FindMinimum[ > Pb0H2DistDoubleFitMS[1.51, > sigma0, 1.57, sigma1, H20, 1.4\ 10^16, > 1.1\ 10^16], > {H20, {5\ 10^23, 6\ 10^23}, 10^21, > 10^25}, {sigma0, > {0.1, 0.12}, 0, 0.2}, {sigma1, {0.1, 0.12}, 0, > 0.2}, AccuracyGoal > -> 50, MaxIterations -> 1000, > WorkingPrecision -> 100]\)}], > "Input"] > }, Open ]] --