Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Help with Loop to Rule Based Algorithm

  • To: mathgroup at smc.vnet.net
  • Subject: [mg114802] Re: Help with Loop to Rule Based Algorithm
  • From: Daniel Lockhart <daniel.lockhart at gmail.com>
  • Date: Fri, 17 Dec 2010 03:31:01 -0500 (EST)
  • References: <201012161048.FAA11817@smc.vnet.net>

Murray,

Thanks for the reply. Yes, the pseudocode is a bit inconsistent. I
intended alpha to a function of arrays x and u, from 1 < n < i, if i
is the current step. Your notation x[i_] := x[i] = x[i-1] + f[x[i-1],
u[i-1]] (u[i] - x[i-1]) completely helped me understand how to do this
in Mathematica.

I think this does an example of what I am looking for:

Clear[dat, datFilt, datFiltnon, x, z, alpha]
dat = Evaluate[Sin[2 Pi omega t] /. {omega -> 0.5, t -> Table[n, {n,
0, 10, 0.05}]}];
u[n_] := dat[[n]]

x[1] = u[1];
z[1] = u[1];
alpha[f_, n_] := If[n == 1, f[n], 0.5 Abs[f[n] - f[n - 1]]]

x[i_] := x[i] = x[i - 1] + 0.15 (u[i] - x[i - 1])
z[i_] := z[i] = z[i - 1] + alpha[u, i] (u[i] - z[i - 1])

datFilt = Table[x[n], {n, 1, Length[dat]}];
datFiltNon = Table[z[n], {n, 1, Length[dat]}];
ListPlot[{dat, datFilt, datFiltNon}]

Here, x is the linear filter output of u, and z is the non-constant
gain filter of input u.

Thanks!


On Thu, Dec 16, 2010 at 8:31 AM, Murray Eisenberg <murray at math.umass.edu> wrote:
> Your pseudo-code seems to be using three different notations involving u:
>
>  In first line, u{1}   [braces, no subscript]
>
>  In third line, u    [ I presume alpha should be a number; but your x is, it
> would seem an array you're defining in the loop and your u seems to be an
> array, too; so is alpha a constant depending on the entire array u and the
> entire array x, or what ??]
>
>  In fourth line, u_{i}, [ with a subscript]
>
> So first let me ask if the following, modified, pseudo-code is what you
> meant:
>
>   x_{1} = u_{1};
>   for i = 2 to N
>      alpha = f(x_{i-1}, u_{i-1});
>      x_{i} = x_{i-1} + alpha * (u_{i} - x_{i-1});
>   end for;
>
> If not, what DID you mean?
>
> If so, then in Mathematica:
>
>   x[1] = u[1];
>   x[i_] := x[i] = x[i-1] + f[x[i-1], u[i-1]] (u[i] - x[i-1])
>
> This is a recursive definition, of course, which may or may not suit your
> purposes.  It gives two rules, the particular one for x at 1 (which as a
> particular rule takes precedence over a general rule about x), and the
> general, recursive rule.
>
> The latter uses the "x[i_] := x[i] = ... " expression in order to make
> Mathematica "remember" a value of x[i] as soon as it calculates it, in other
> words, to add a rule for, say, x[2] = .... and x[3] = ..., etc., as soon as
> they are first calculated, so the recursion doesn't have to descend to the
> base each time a new value is calculated.
>
>
> On 12/16/2010 5:48 AM, Daniel Lockhart wrote:
>>
>> Hi all,
>>
>> I have been a long time Mathematica user, but have always had problems
>> writing Mathematica code using rules from existing algorithms that utilize
>> loops.
>>
>> Suppose I want to write a simple smoothing filter, but not use any
>> built-in Mathematica algorithm. Just to make the point, I want the smoothing
>> gain/coefficient to be a nonlinear function. So, I want this pseudocode:
>>
>> x_{1} = u{1};
>> for i = 2 to N
>>   alpha = f(x, u);
>>   x_{i} = x_{i-1} + alpha * (u_{i} - x_{i-1});
>> end for;
>>
>> if u is the input data, and f(x, u) is a nonlinear function of x and u. If
>> alpha was constant and 0<  alpha<  1, x would be some sort of moving=
 average
>> of u.
>>
>> How can I do this in Mathematica without writing an explicit loop? I am
>> guessing some from of recursive Map, but I am at a loss on how to start.
>>
>> Thanks!
>>
>
> --
> Murray Eisenberg                     murray at math.umass.edu
> Mathematics & Statistics Dept.
> Lederle Graduate Research Tower      phone 413 549-1020 (H)
> University of Massachusetts                413 545-2859 (W)
> 710 North Pleasant Street            fax   413 545-1801
> Amherst, MA 01003-9305
>


  • Prev by Date: Re: FindRoot failing in v8 on a system easily solvable in v7
  • Next by Date: Re: Obtaining information about function definitions
  • Previous by thread: Re: Help with Loop to Rule Based Algorithm
  • Next by thread: how to debug existing notebook in workbench?