Re: Help with Loop to Rule Based Algorithm
- To: mathgroup at smc.vnet.net
- Subject: [mg114780] Re: Help with Loop to Rule Based Algorithm
- From: Murray Eisenberg <murray at math.umass.edu>
- Date: Fri, 17 Dec 2010 03:27:00 -0500 (EST)
- References: <201012161048.FAA11817@smc.vnet.net>
- Reply-to: murray at math.umass.edu
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
- References:
- Help with Loop to Rule Based Algorithm
- From: Daniel Lockhart <daniel.lockhart@gmail.com>
- Help with Loop to Rule Based Algorithm