Re: NonlinearRegress and numerical functions...
- To: mathgroup at smc.vnet.net
- Subject: [mg20219] Re: [mg20132] NonlinearRegress and numerical functions...
- From: Larske Ragnarsson <loke at ic.chalmers.se>
- Date: Wed, 6 Oct 1999 21:06:35 -0400
- Organization: Chalmers University of Technology
- References: <7t8d2v$gei@smc.vnet.net> <7tcajd$m32@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
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!! /Lars-&Aring;ke 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 ]]