FindMinimum and Module
- To: mathgroup at smc.vnet.net
- Subject: [mg113120] FindMinimum and Module
- From: Versiane UFOP <versiane.ufop at gmail.com>
- Date: Wed, 13 Oct 2010 23:26:43 -0400 (EDT)
Dear Mathematica users
I would like to request any help with the code below, which I have been
struggling in the last couple of weeks. I am trying to use FindMinimum
to find the best k value that fits experimental data (extração) using
the code enclosed in a Module structure. This is a heterogeneous
kinetics problem where the Shrinking Core Model is modified to
incorporate particle size distribution and k is a rate constant. As many
of you always express here FindRoot does not produce the expected
outcome and give the standard message ""The function value...is not a
real number at {k} = {0.03`}". I would very much appreciate any help.
The code is:
mean := 100;
std := 10;
a = 5.032;
b = 2.974;
dmax = 190;
u = 1;
extração = {{0, 0.}, {10, 0.068973}, {20, 0.105011}, {30, 0.127376},
{40, 0.152779}, {50, 0.177607}, {60, 0.186656}, {80, 0.224261}, {100,
0.25433}, {120, 0.275795}}
f[D_] := (1/(b^a*Gamma[a]))*D^(a - 1)*Exp[-D/b]
t := Table[extração[[i, 1]], {i, Length[extração]}]
model = ConstantArray[0, {Length[extração]}]
conversion[(k_)?NumericQ] := Module[{dmin, rn, n, d, y, w, unconvt},
For[j = 1, j <= Length[t], j++,
dmin = (k*t[[j]])^0.5;
rn = (dmax - dmin)/(2*u) + 1; n = Round[rn];
d = Table[dmin + (2*i - 1)*u, {i, n}];
w = Table[y /. FindRoot[1 - 3*(1 - y)^(2/3) + 2*(1 - y) ==
(k/d[[i]]^2)*t[[j]], {y, 0.3}], {i, n}];
unconvt = 1 - Sum[(1 - w[k][[i]])*N[Integrate[f[D], {D, d[[i]] -
u, d[[i]] + u}]], {i, 1, n}];
model[[j]] = unconvt; ];
model1 = {t, model};
x = Transpose[model1]; ]
fit[(k_)?NumericQ] := Sum[(conversion[k][extração[[i, 1]]] -
extração[[i, 2]])^2, {i, 1, Length[extração]}];
FindMinimum[{fit[k], k > 0}, {k, 0.03}]
--
Prof. Versiane Albis Leão
Bio&Hidrometallurgy Laboratories
Department of Metallurgical and Materials Engeng.
Universidade Federal de Ouro Preto, Brazil.