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 ]]