I need to define the following function

MyWavelet[n_][“PrimalLowpass”, prec_ : MachinePrecision] :=

Table[(-1)^(j – 1) h[[2*n – j]], {j, 0, 2*n – 1}]

which depends on the following code

num = T;

precis = 32;

p[n_, x_] := Sum[ Binomial[n-1+j,j]*x^j, {j,0,n-1}]

pol[n_, z_] := Expand[z^(n-1) * p[n, (1 – (z + 1/z)/2)/2]]

roo[n_] := NSolve[pol[n, x] ==0, x, precis]

absgreater[x1_, x2_] := Abs[x1] < Abs[x2]
sroo[n_] := Sort[roo[n], absgreater]
insidehalf[n_] := Take[sroo[n], n-1]
rootlist = x /. insidehalf[num];
prod = Expand[Product[(w - rootlist[[j]]), {j, 1, num - 1}]];
normalizer = prod 2^(num - 1/2) /. w -> 1;

polyn = Expand[(1 + w)^num * prod/normalizer];

h = Reverse[N[CoefficientList[polyn, w], precis]];

where T is an integer.

My problem is I need to replace num with the value of n when calling the MyWavelet function and then dynamically evaluate, so I can get the h table values assigned to the specific MyWavelet[n].

I tried couple o’times using `With, but with no success.

=================

The Length of h appears to be 2num. You could feed h to MyWavelet and derive n from it.

– Xerxes

Mar 3 ’13 at 5:29

=================

1 Answer

1

=================

Try specifying your function as MyWavelet[n_,opts:OptionsPattern[]] (documentation) and define Options to your function Method->”PrimalLowpass”,Precision->$MachinePrecision, like this:

Options[MyWavelet] ={Method->”PrimalLowpass”,Precision->$MachinePrecision}

To actually construct all this as a function, you need to put certain steps as a Module, and some outside as auxiliary functions. First you will need to do this:

Clear[rootlist, prod, normalizer, polyn, h]

Then something like the following should work. Notice how I’ve cascaded the use of prec to some of the auxiliary functions and made them two-parameter functions. Because prec is used as a parameter in the definition of rootlist, it needs to be outside that set of Module definitions. If I had not put the definition of rootlist inside the curly braces defining the names of modularized variables, i.e. I had written Module[{rootlist, prod…},rootlist= x/.insidehalf[n,prec], this wouldn’t have been necessary.

p[n_, x_] := Sum[Binomial[n – 1 + j, j]*x^j, {j, 0, n – 1}]

pol[n_, z_] := Expand[z^(n – 1)*p[n, (1 – (z + 1/z)/2)/2]]

roo[n_, prec_] := NSolve[pol[n, x] == 0, x, prec]

absgreater[x1_, x2_] := Abs[x1] < Abs[x2]
sroo[n_, prec_] := Sort[roo[n, prec], absgreater]
insidehalf[n_, prec_] := Take[sroo[n, prec], n - 1]
MyWavelet[n_Integer?Positive, opts : OptionsPattern[]] :=
With[{prec = OptionValue[Precision]},
Module[{rootlist = x /. insidehalf[n, prec], prod, normalizer,
polyn, h, w},
prod = Expand[Product[(w - rootlist[[j]]), {j, 1, n - 1}]];
normalizer = prod 2^(n - 1/2) /. w -> 1;

polyn = Expand[(1 + w)^n*prod/normalizer];

h = Reverse[N[CoefficientList[polyn, w], prec]];

Table[(-1)^(j – 1) h[[2*n – j]], {j, 0, 2*n – 1}]

]]

Note that you have small imaginary parts that you might not want:

MyWavelet[3, Precision -> 32]

{-0.03522629188570953660274066471551 +

0.*10^-33 I, -0.0854412738820266616928191691818 + 0.*10^-33 I,

0.1350110200102545886963899066994 + 0.*10^-32 I,

0.4598775021184915700951519421476 +

0.*10^-32 I, -0.8068915093110925764944936040887 + 0.*10^-32 I,

0.3326705529500826159985115891390 + 0.*10^-33 I}

You can get rid of them using Chop.

By the way, the Method doesn’t currently do anything, but I assume this is a cut-down version of the real problem.

I made one small change – you were using the OP’s symbol precis, where I suspect you wanted your symbol prec scoped by your With statement.

– Mark McClure

Mar 3 ’13 at 13:44

1

Is there any specific reason that you’re using number $MachinePrecision (which might be nice, if you want the precision tracked), rather than the symbol MachinePrecision (which might be nice, if you want speed)?

– Mark McClure

Mar 3 ’13 at 13:46

The problem is the values I obtain and assign to the specific MyWavelet[n] are not a valid wavelet specification, i.e. {{0,val0},{1,val1},{2,val2},{3,val3}} for n = 2. I need to make this work so I can plot the mother and father functions, which I was unable to do using the old “change-everything-by-hand” method.

– Sektor

Mar 3 ’13 at 15:01

Thanks @MarkMcClure – stupid typo from answering too quickly! No specific reason I used $MachinePrecision, might have just used the one I remembered.

– Verbeia♦

Mar 3 ’13 at 22:42