Re: Forgets Variables?
- To: mathgroup at smc.vnet.net
- Subject: [mg97221] Re: [mg97175] Forgets Variables?
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Sun, 8 Mar 2009 05:53:14 -0500 (EST)
- References: <200903070738.CAA16926@smc.vnet.net>
- Reply-to: drmajorbob at bigfoot.com
I can't get the first statement to execute (in the time I'm willing to
wait). If you gave us the values of maxX, eqTime, v, lifetime27SA, et
cetera, we'd waste a lot less time guessing what your problem might be.
If you want help, ALWAYS start us off where you are. Don't make us
flounder around where you've already been. Because, of course, why should
we?
That said, I'd start by simplifying until the code is understandable, at
which point the error will reveal itself. For instance, this:
If[v*(tsum - lifetime35S - eqTime) < 4000,
v*(tsum - lifetime35S - eqTime), 4000]
is equivalent to the simpler (and faster)
Min[v*(tsum - lifetime35S - eqTime), 4000]
Similarly, this expression:
If[v*(tsum - eqTime) < 4000, Max[v*(tsum - eqTime), 0], 4000]
is equivalent to
Max[0, Min[v*(tsum - eqTime), 4000]]
Next, it's easy to see that
If[v*(tsum2 - eqTime) < 4000,
Sum[Max[v*(tsum - eqTime), 0], {tsum, tsum2 - lifetime27SANTC + 1,
tsum2}],
Sum[Max[0, Min[v*(tsum - eqTime), 4000]], {tsum,
tsum2 - lifetime27SANTC + 1, tsum2}]]
is equivalent to
Clear[q]
q[ts_] := v*(ts - eqTime);
If[q@tsum2 < 4000,
Sum[Max[q@tsum, 0], {tsum, tsum2 - lifetime27SANTC + 1, tsum2}],
Sum[Max[0, Min[q@tsum, 4000]], {tsum, tsum2 - lifetime27SANTC + 1,
tsum2}]]
and that's equivalent to (since the Sums have the same limits):
Clear[q]
q[ts_] := v*(ts - eqTime);
Sum[If[q@tsum2 < 4000, Max[q@tsum, 0],
Max[0, Min[q@tsum, 4000]]], {tsum, tsum2 - lifetime27SANTC + 1,
tsum2}]
Similarly, the first If statement:
If[v*(tsum2 - lifetime35S - eqTime) < 4000,
Sum[Max[v*(tsum - lifetime35S - eqTime), 0], {tsum,
tsum2 - lifetime27SA + 1, tsum2}],
Sum[Min[v*(tsum - lifetime35S - eqTime), 4000], {tsum,
tsum2 - lifetime27SA + 1, tsum2}]]
is equivalent to
Clear[q]
q[ts_] := v*(ts - lifetime35S - eqTime);
Sum[If[q@tsum2 < 4000, Max[q@tsum, 0], Min[q@tsum, 4000]], {tsum,
tsum2 - lifetime27SA + 1, tsum2}]
Combining both tricks into one reduces the original expression to:
Clear[q]
q[life_][ts_] := v (ts - life - eqTime)
callNormValue =
60/maxX Sum[
Sum[If[q[lifetime35S]@tsum2 < 4000, Max[q[lifetime35S]@tsum, 0],
Min[q[lifetime35S]@tsum, 4000]], {tsum,
tsum2 - lifetime27SA + 1, tsum2}]*(1 - P) +
Sum[If[q[0]@tsum2 < 4000, Max[q[0]@tsum, 0],
Max[0, Min[q[0]@tsum, 4000]]], {tsum,
tsum2 - lifetime27SANTC + 1, tsum2}]*P, {tsum2, 60, t2, 60}];
That still won't evaluate without values for all the parameters, but
you're the only one that knows those, or even knows what ranges they might
lie in.
One trick you MIGHT pull, however, is this:
Clear[q]
q[life_][ts_] := v (ts - life - eqTime)
callNormValue =
60/maxX sum[
sum[If[q[lifetime35S]@tsum2 < 4000, Max[q[lifetime35S]@tsum, 0],
Min[q[lifetime35S]@tsum, 4000]], {tsum,
tsum2 - lifetime27SA + 1, tsum2}]*(1 - P) +
sum[If[q[0]@tsum2 < 4000, Max[q[0]@tsum, 0],
Max[0, Min[q[0]@tsum, 4000]]], {tsum,
tsum2 - lifetime27SANTC + 1, tsum2}]*P, {tsum2, 60, t2, 60}];
(Now the statement executes.)
callNormValue /. {lifetime35S -> 17, P -> 0.7, t2 -> maxX, sum -> Sum}
(The other parameters still need values, but those could be added to the
rule list.)
Bobby
On Sat, 07 Mar 2009 01:38:46 -0600, Ktota <NuKtoBi at gmail.com> wrote:
> Hi there,
>
> i have the following procedure:
>
> callNormValue = (Sum[
> If[v*(tsum2 - lifetime35S - eqTime) < 4000,
> Sum[Max[v*(tsum - lifetime35S - eqTime), 0], {tsum,
> tsum2 - lifetime27SA + 1, tsum2, 1}],
> Sum[If[v*(tsum - lifetime35S - eqTime) < 4000,
> v*(tsum - lifetime35S - eqTime), 4000], {tsum,
> tsum2 - lifetime27SA + 1, tsum2, 1}]]*(1 - P) +
> If[v*(tsum2 - eqTime) < 4000,
> Sum[Max[v*(tsum - eqTime), 0], {tsum,
> tsum2 - lifetime27SANTC + 1, tsum2, 1}],
> Sum[If[v*(tsum - eqTime) < 4000, Max[v*(tsum - eqTime), 0],
> 4000], {tsum, tsum2 - lifetime27SANTC + 1, tsum2, 1}]]*
> P, {tsum2, 60, t2, 60}])/(maxX/60);
>
> i call it with:
> callNormValue /. {lifetime35S -> 17, P -> 0.7, t2 -> maxX}
>
> it gives me a proper result, but as soon i change t2 to maxX in the
> first expression (where i do the sums) it doesn't evaluate the the
> procedure anymore (maxX has a global value already set). I have
> actually quite a lot of trouble to hand over values to this
> procedure.. and i have no idea why it doesn't work.
>
> (for except lifetime35S,P and t2 all the variables have a set value)
>
> thank you,
>
> Ktota
>
>
--
DrMajorBob at bigfoot.com
- References:
- Forgets Variables?
- From: Ktota <NuKtoBi@gmail.com>
- Forgets Variables?