The following code, regardless of CAS or programming language, will follow some structure, and will always have the following functions:
|
Finds an n-th degree polynomial approximate solution to
a given functional equation.
Usage: FSolve[equation, f[x], {x, x0, n}, {coeff}] |
|
Prepares a list of power series coefficients from
an n-th degree Abel linearization of a function.
(Formerly known as prepare.) This function is equivalent
to FSolve[a[f[x]] == a[x] + 1, a[x], {x, x0, n}, {y0}]
Usage: Linearize[f[x], {x, x0, n}] |
|
Finds the super-logarithm base x of z using the coefficients. |
|
Finds the y-th tetration of x using inverse function methods. |
Recently I have been using Mathematica more than Maple, so the most recent version of the code is available for Mathematica only. If I have time or get funding I may take the time to port it over to Maple someday. Until then I would recommend using my most recent package with a trial version of Mathematica if you cannot afford the full version.
(* ** Usage: ** prep = SuperLogPrepare[n, x]; ** SuperLog[prep, z] -- gives n-th approx. of slog_x(z) ** Tetrate[prep, y] -- gives n-th approx. of x^^y ** ** Copyright 2005 Andrew Robbins *) SuperLogPrepare[n_Integer, x_] := {x, LinearSolve[Table[ k^j/k! - If[j == k, Log[x]^-k, 0], {j, 0, n - 1}, {k, 1, n}], Table[If[k == 1, 1, 0], {k, 1, n}]]} SuperLog[v_, z_?NumericQ] := Block[{(*SlogCrit*)}, SlogCrit[zc_] := -1 + Sum[v2, k*zc^k/k!, {k, 1, Length[v2]}]; Which[z ² 0, SlogCrit[v1^z] - 1, 0 < z ² 1, SlogCrit[z], z > 1, Block[{i=-1}, SlogCrit[NestWhile[Log[v1, #]&, z, (i++;#>1)&]]+i]]] Tetrate[v_, y_?NumericQ] := Block[{(*SlogCrit, TetCrit*)}, SlogCrit[zc_] := -1 + Sum[v2, k*zc^k/k!, {k, 1, Length[v2]}]; TetCrit[yc_] := FindRoot[SlogCrit[z] == yc, {z, 1}]1, 2; If[y > -1, Nest[Power[v1, #]&, TetCrit[y - Ceiling[y]], Ceiling[y]], Nest[Log[v1, #]&, TetCrit[y - Ceiling[y]], -Ceiling[y]]]]
(* Usage: ** ** prep = SuperLogPrepare[x, n]; -- Prepare for slog_x(z)_n ** SuperLog[x, z] -- Prepare fast (n=10) ** SuperLog[prep, z] -- Use local prep ** SuperLog[z] -- Use global prep *) SuperLogPrepare[x_, n_Integer] := {x, LinearSolve[Table[ k^j/k! - If[j == k, Log[x]^-k, 0], {j, 0, n - 1}, {k, 1, n}], Table[If[k == 1, 1, 0], {k, 1, n}]]} SuperLogPrepare[x_, {nMax_Integer}] := SuperLogPrepare[x, {1, nMax}] SuperLogPrepare[x_, {nMin_Integer, nMax_Integer}] := SuperLogPrepare[x, {nMin, nMax, 1}] SuperLogPrepare[x_, {nMin_Integer, nMax_Integer, nStep_Integer}] := Block[{m}, m = Table[If[k <= nMax, k^j/k! - If[j == k, Log[x]^-k, 0], If[j == 0, 1, 0]], {j, 0, nMax - 1}, {k, 1, nMax + 1}]; Table[m[[Range[i]]] = RowReduce[m[[Range[i]]]]; {x, m[[Range[i], nMax + 1]]}, {i, nMin, nMax, nStep}]] SuperLogLinear[x_, z_] := SuperLog[{x, {}}, z, (#2-1)&] SuperLogCritical[{x_, terms_}, z_] := -1 + Sum[terms[[k]]*z^k/k!, {k, 1, Length[terms]}] SuperLog[z_?NumericQ] := SuperLog[$SuperLogPrep, z] SuperLog[{x_?NumericQ, terms_List}, z_?NumericQ] := SuperLog[{x, terms}, z, SuperLogCritical] SuperLog[{x_?NumericQ, terms_List}, z_?NumericQ, f_] := Which[ z < 0, f[{x, terms}, x^z] - 1, z == 0, -1, 0 < z < 1, f[{x, terms}, z], z == 1, 0, z > 1, Block[{i = -1}, f[{x, terms}, NestWhile[Log[x,#]&,z,(i++;#>1)&]]+i]] InternalSLO2[x_, z_] := Block[{dec, mtx, y1, y2}, mtx = Table[Table[If[k == 12, If[j == 0, 1, 0], k^j/k! - If[j == k, Log[x]^-k, 0]], {k, 1, 12}], {j, 0, 10}]; mtx[[Range[10]]] = RowReduce[mtx[[Range[10]]]]; y1 = SuperLog[{x, Most[mtx][[All, 12]]}, z]; y2 = SuperLog[{x, RowReduce[mtx][[All, 12]]}, z]; If[y1 != y2, dec = Floor[-Log[10, Abs[y2 - y1]]]; Floor[y2*10^dec]/10^dec, y2]]; InternalSLO3 = Compile[{{x, _Real}, {z, _Real}}, InternalSLO2[x, z]]; SuperLog[x_?NumericQ, z_?NumericQ] /; (1.4 <= x <= 16) := InternalSLO3[x, z] (* Usage: ** ** prep = SuperLogPrepare[x, n]; -- Prepare for tet_x(y)_n ** Tetrate[x, y] -- Prepare fast (n=10) ** Tetrate[prep, z] -- Use local prep ** Tetrate[z] -- Use global prep *) TetrateLinear[x_, y_] := Tetrate[{x, {}}, y, (#2+1)&] TetrateCritical[prep_, y_] := FindRoot[SuperLogCritical[prep, z] == y, {z, 1}][[1, 2]] Tetrate[y_?NumericQ] := Tetrate[$SuperLogPrep, y] Tetrate[{x_?NumericQ, terms_List}, y_?NumericQ] := Tetrate[{x, terms}, y, TetrateCritical] Tetrate[{x_?NumericQ, terms_List}, y_?NumericQ, f_] := If[y > -1, Nest[Power[x, #]&, f[{x, terms}, y - Ceiling[y]], Ceiling[y]], Nest[Log[x, #]&, f[{x, terms}, y - Ceiling[y]], -Ceiling[y]]] InternalTEO2[x_, y_] := Block[{dec, mtx}, mtx = Table[Table[If[k == 12, If[j == 0, 1, 0], k^j/k! - If[j == k, Log[x]^-k, 0]], {k, 1, 12}], {j, 0, 10}]; mtx[[Range[10]]] = RowReduce[mtx[[Range[10]]]]; z1 = FindRoot[SuperLog[{x, Most[mtx][[All, 12]]}, z] == y, {z, 1}][[1, 2]]; z2 = FindRoot[SuperLog[{x, RowReduce[mtx][[All, 12]]}, z] == y, {z, 1}][[1, 2]]; If[z1 != z2, dec = Floor[-Log[10, Abs[z2 - z1]]]; Floor[z2*10^dec]/10^dec, z2]] InternalTEO3 = Compile[{{x, _Real}, {y, _Real}}, InternalTEO2[x, y]]; Tetrate[x_?NumericQ, y_?NumericQ] /; (1.4 <= x) := If[y > -1, Nest[Power[x, #]&, InternalTEO3[x, y - Ceiling[y]], Ceiling[y]], Nest[Log[x, #]&, InternalTEO3[x, y - Ceiling[y]], -Ceiling[y]]] (* Fast Approximations: ** ** SuperRoot[y, z] == srt_y(z) (n=10) ** IterExp[x, y, a] == exp_x^y(a) (n=10) ** IterLog[x, y, a] == log_x^y(a) (n=10) *) SuperRoot[y_, z_] := FindRoot[Tetrate[x, y] == z, {x, 2}][[1, 2]] IterExp[x_, y_, a_] := Tetrate[x, y + SuperLog[x, a]] IterLog[x_, y_, a_] := IterExp[x, -y, a] (* Globals *) $SuperLogPrep = SuperLogPrepare[E, 10];
## Usage: ## prep := superlog_prepare(n, x): ## superlog(prep, z); -- gives n-th approx. of slog_x(z) ## tetrate(prep, y); -- gives n-th approx. of x^^y ## ## Copyright 2005 Andrew robbins ## with(linalg): superlog_prepare := proc(n::integer, x) [x, linsolve(matrix([seq([seq( k^j/k!-`if`(j=k,1,0)*log(x)^(-j), k=1..n)], j=0..(n - 1))]), [seq(`if`(k=1,1,0),k=1..n)])]; end proc; superlog := proc(v, z) local slog_crit; if not (z::numeric) then return 'procname'(args); end if; slog_crit := proc(zc) -1 + sum(v[2][k]*zc^k/k!, k=1..(vectdim(v[2]))); end proc; piecewise(z = -infinity, -2, z < 0, slog_crit(v[1]^z) - 1, z = 0, -1, 0 < z and z < 1, slog_crit(z), z = 1, 0, z > 1, (proc() local a, i; a := evalf(z); for i from 0 while (a > 1) do a := evalf(log[v[1]](a)); end do; slog_crit(a) + i; end proc)()); end proc; tetrate := proc(v, y) local tet_crit; if not (y::numeric) then return 'procname'(args); end if; tet_crit := proc(yc) local slog_crit; slog_crit := proc(zc) -1 + sum(v[2][k]*zc^k/k!, k=1..(vectdim(v[2]))); end proc; select((proc(a) evalb(Im(a) = 0 and 0 <= Re(a) and Re(a) <= 1) end proc), [solve(evalf(slog_crit(z)) = yc, z)])[1]; end proc; piecewise(y = -2, -infinity, -2 < y and y < -1, log[v[1]](tet_crit(y+1)), y = -1, 0, -1 < y and y < 0, tet_crit(y), y = 0, 1, y > 0, (proc () local a, i; a := tet_crit(y - ceil(y)); for i from 1 to ceil(y) do a := v[1]^a; end do; evalf(a); end proc)()); end proc;
## Usage: ## ## prep := superlog_prepare(x, n): -- Prepares for slog_x(z)_n ## superlog(x, z); -- Prepares fast (n=10) ## superlog(prep, z); -- Uses 'prep' ## superlog(z); -- Uses 'Global_superlog_prep' ## with(linalg): superlog_prepare := proc(x, n::integer) [x, linsolve(matrix([seq([seq( k^j/k!-`if`(j=k,1,0)*log(x)^(-j), k=1..n)], j=0..(n - 1))]), [seq(`if`(k=1,1,0),k=1..n)])]; end proc; superlog_linear := proc(x, z) superlog([x, []], z, (proc(v, z) z - 1; end proc)); end proc; superlog_critical := proc(v, z) -1 + sum(v[2][k]*z^k/k!, k=1..vectdim(v[2])); end proc; superlog := proc() local prep, x, z, f; if (nops([args]) = 1) then if not ([args][1]::numeric) then return 'procname'(args); end if; superlog(Global_superlog_prep, args, superlog_critical); elif (nops([args]) = 2) then z := evalf([args][2]); if not (z::numeric) then return 'procname'(args); end if; if not ([args][1]::list) then x := evalf([args][1]); prep := [x, linsolve(matrix([seq([seq( evalf(k^j/k!-`if`(j=k,1,0)*log(x)^(-j)), k=1..10)], j=0..9)]), [seq(`if`(k=1,1,0),k=1..10)])]; superlog(prep, z, superlog_critical); elif ([args][1]::list) then superlog(args, superlog_critical); else return 'procname'(args); end if; elif (nops([args]) = 3) then z := [args][2]; f := [args][3]; if not (evalf(z)::numeric) then return 'procname'(args); end if; if (([args][1])::list) then prep := [args][1]; x := [args][1][1]; if not (evalf(x)::numeric) then return 'procname'(args); end if; else return 'procname'(args); end if; piecewise( z < 0, f(prep, x^z) - 1, z = 0, -1, 0 < z and z < 1, f(prep, z), z = 1, 0, z > 1, (proc() local a, i; a := evalf(z); for i from 0 while (a > 1) do a := evalf(log[x](a)); end do; f(prep, a) + i; end proc)()) else return 'procname'(args); end if; end proc; ## Usage: ## ## prep := superlog_prepare(x, n): -- Prepares for slog_x(z)_n ## tetrate(x, y); -- Prepares fast (n=10) ## tetrate(prep, y); -- Uses 'prep' ## tetrate(y); -- Uses 'Global_superlog_prep' ## tetrate_critical := proc(v, y) local slog_critical; select((proc(a) evalb(Im(a) = 0 and 0 <= Re(a) and Re(a) <= 1) end proc), [solve(evalf(superlog_critical(v, z)) = y, z)])[1]; end proc; tetrate := proc() local prep, x, y, f; if (nops([args]) = 1) then if not ([args][1]::numeric) then return 'procname'(args); end if; tetrate(Global_superlog_prep, args, tetrate_critical); elif (nops([args]) = 2) then y := evalf([args][2]); if not (y::numeric) then return 'procname'(args); end if; if not ([args][1]::list) then x := evalf([args][1]); prep := [x, linsolve(matrix([seq([seq( evalf(k^j/k!-`if`(j=k,1,0)*log(x)^(-j)), k=1..10)], j=0..9)]), [seq(`if`(k=1,1,0),k=1..10)])]; tetrate(prep, y, tetrate_critical); elif ([args][1]::list) then tetrate(args, tetrate_critical); else return 'procname'(args); end if; elif (nops([args]) = 3) then y := [args][2]; f := [args][3]; if not (evalf(y)::numeric) then return 'procname'(args); end if; if (([args][1])::list) then prep := [args][1]; x := [args][1][1]; if not (evalf(x)::numeric) then return 'procname'(args); end if; else return 'procname'(args); end if; piecewise( y = -2, -infinity, -2 < y and y < -1, log[x](tetrate_critical(prep, y + 1)), y = -1, 0, -1 < y and y < 0, tetrate_critical(prep, y), y = 0, 1, y = 1, x, y > 0, (proc () local a, i; a := tetrate_critical(prep, y - ceil(y)); for i from 1 to ceil(y) do a := x^a; end do; evalf(a); end proc)()); else return 'procname'(args); end if; end proc; Global_superlog_prep := superlog_prepare(exp(1), 10):