I have a function and when i evaluate it i get "General::ivar: 0 is not a valid variable". it also decreases the speed tremendously. How can i increase the speed and get rid of this message? this message does not affect the accuracy of the result but rather the speed. Would appreciate any help.
MX[m1num10_, m2num10_, nx0_?NumericQ, lx0_?NumericQ, y1_, n_] := Block[
{xx, x, xxinv, xxtrans, xxinvtrans, kx, kx1, Detxx, HX, kxbar,
kx1bar, q, ki, xxte, mkx, mmax, a, b, DATA, op1, m1, m2, CiJkL,
sol, i, J, j, k, L, m1num1 = m1num10, m2num1 = m2num10, nx = nx0,
lx = lx0, lambda, ss},
xx := Table[Subscript[x, i, J], {i, 3}, {J, 3}];
xxinv = Inverse[xx];
xxtrans = Transpose[xx];
xxinvtrans = Inverse[xxtrans];
kx := Tr[xxtrans.xx];
kx1 := 1/2 (Tr[xxtrans.xx]^2 - Tr[xxtrans.xx.xxtrans.xx]);
Detxx := Det[xx];
kxbar := kx/Detxx^(2/3);
kx1bar := kx1/Detxx^(4/3);
HX[nx_, lx_, kxbar_, Detxx_] := nx/2 (kxbar - 3) + lx*(Detxx - 1)^2;
q = Table[
D[HX[nx, lx, kxbar, Detxx], Subscript[x, i, J]], {i, 3}, {J, 3}];
ki = Inverse[xx].q;
xxte = {{m1, 0, 0}, {0, m2, 0}, {0, 0, m2}};
Subscript[x, 1, 1] = xxte[[1, 1]];
Subscript[x, 2, 2] = xxte[[2, 2]];
Subscript[x, 3, 3] = xxte[[3, 3]];
Subscript[x, 1, 2] = xxte[[1, 2]];
Subscript[x, 1, 3] = xxte[[1, 3]];
Subscript[x, 2, 3] = xxte[[2, 3]];
Subscript[x, 2, 1] = xxte[[2, 1]];
Subscript[x, 3, 1] = xxte[[3, 1]];
Subscript[x, 3, 2] = xxte[[3, 2]];
mkx = (1.0/Det[xxte])*(xxte.ki.Transpose[xxte]);
For[i = 2, i <= n + 1, i++,
sol = FindRoot[
mkx[[2, 2]] == 0 /. m1 -> m1num1[[i]], {m2, m2num1[[i - 1]]},
MaxIterations -> 2500, AccuracyGoal -> 8];
m2num1[[i]] := m2 /. sol;
];
op1 = mkx[[1, 1]] /. {m1 -> m1num1, m2 -> m2num1};
ss = Norm[op1 - y1]
];
la = 5;
testSize = 100;
numvariable = 2;
n = 99;
m1num10 = Table[1 + (la - 1)/n*i, {i, 0, n}];
m2num10 = Table[0, {i, 0, n}];
m2num10[[1]] = 1;
DATA = {{1, 0}, {1.04, 0.179882}, {1.08, 0.360228}, {1.14,
0.632594}, {1.23, 1.04777}, {1.365, 1.69152}, {1.5675,
2.71869}, {1.87125, 4.4266}, {2.32688, 7.41251}, {3.01031,
12.9046}, {4.03547, 23.4365}, {5., 35.7603}};
a = Table[DATA[[i, 1]], {i, 1, 12}];
b = Table[DATA[[i, 2]], {i, 1, 12}];
xx = Interpolation[Transpose[{a, b}], Method -> "Hermite"];
y1 = Table[xx[x], {x, m1num10}];
F[nx0_, lx0_] := MX[m1num10, m2num10, nx0, lx0, y1, n];
test = Reap[
For[i = 1, i <= testSize, i++,
Sow[Table[0, {i, numvariable}]]];][[2, 1]];
test[[All, 1]] = RandomReal[{0, 5}, {100}];
test[[All, 2]] = RandomReal[{1, 1000}, {100}];
F @@@ test
The problem is not the derivatives as i mentioned. Instead of relating components of xx to xxte i related xx to xxte tensor, directly.However, to my surprise the defected version still performs faster. here is the full code:
MX[m1num10_, m2num10_, nx0_?NumericQ, lx0_?NumericQ, y1_, n_] :=
Block[{xx, x, xxinv, xxtrans, xxinvtrans, kx, kx1, Detxx, HX, kxbar,
kx1bar, q, ki, xxte, mkx, mmax, a, b, DATA, op1, m1, m2, CiJkL,
sol, i, J, j, k, L, m1num1 = m1num10, m2num1 = m2num10, nx = nx0,
lx = lx0, lambda, ss},
xx := Table[Subscript[x, i, J], {i, 3}, {J, 3}];
xxinv = Inverse[xx];
xxtrans = Transpose[xx];
xxinvtrans = Inverse[xxtrans];
kx := Tr[xxtrans.xx];
kx1 := 1/2 (Tr[xxtrans.xx]^2 - Tr[xxtrans.xx.xxtrans.xx]);
Detxx := Det[xx];
kxbar := kx/Detxx^(2/3);
kx1bar := kx1/Detxx^(4/3);
HX[nx_, lx_, kxbar_, Detxx_] := nx/2 (kxbar - 3) + lx*(Detxx - 1)^2;
q = Table[
D[HX[nx, lx, kxbar, Detxx], Subscript[x, i, J]], {i, 3}, {J, 3}];
ki = Inverse[xx].q;
xxte = {{m1, 0, 0}, {0, m2, 0}, {0, 0, m2}};
mkx = (1.0/
Det[xxte])*(xxte.(ki /. ToRules[xx == xxte]).Transpose[xxte]);
For[i = 2, i <= n + 1, i++,
sol = FindRoot[
mkx[[2, 2]] == 0 /. m1 -> m1num1[[i]], {m2, m2num1[[i - 1]]},
MaxIterations -> 2500, AccuracyGoal -> 8];
m2num1[[i]] := m2 /. sol;];
op1 = mkx[[1, 1]] /. {m1 -> m1num1, m2 -> m2num1};
ss = Norm[op1 - y1]];
la = 5;
testSize = 100;
numvariable = 2;
n = 99;
m1num10 = Table[1 + (la - 1)/n*i, {i, 0, n}];
m2num10 = Table[0, {i, 0, n}];
m2num10[[1]] = 1;
DATA = {{1, 0}, {1.04, 0.179882}, {1.08, 0.360228}, {1.14,
0.632594}, {1.23, 1.04777}, {1.365, 1.69152}, {1.5675,
2.71869}, {1.87125, 4.4266}, {2.32688, 7.41251}, {3.01031,
12.9046}, {4.03547, 23.4365}, {5., 35.7603}};
a = Table[DATA[[i, 1]], {i, 1, 12}];
b = Table[DATA[[i, 2]], {i, 1, 12}];
xx = Interpolation[Transpose[{a, b}], Method -> "Hermite"];
y1 = Table[xx[x], {x, m1num10}];
F[nx0_, lx0_] := MX[m1num10, m2num10, nx0, lx0, y1, n];
test = Reap[
For[i = 1, i <= testSize, i++,
Sow[Table[0, {i, numvariable}]]];][[2, 1]];
test[[All, 1]] = RandomReal[{0, 5}, {testSize}];
test[[All, 2]] = RandomReal[{1, 1000}, {testSize}];
F @@@ test // AbsoluteTiming