MathGroup Archive 2010

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

Search the Archive

Re: How to Enable Automatic Recalculation

  • To: mathgroup at smc.vnet.net
  • Subject: [mg109870] Re: How to Enable Automatic Recalculation
  • From: dh <dh at metrohm.com>
  • Date: Thu, 20 May 2010 06:39:57 -0400 (EDT)
  • References: <ht1uua$3cf$1@smc.vnet.net>

Hi,
there seems to be two pitfalls in method 2 and 3.
Dynamic is thought to update screen outputs, not to recalculate 
variables. If nothing is printed, Dynamic is not even evaluated.
Let's look at method2:
      (* method 2: use Dynamic *)
      Clear[a,b]
      Dynamic[a]
  a
      a = 3;  (* preceding output changes to 3 *)
      b = 3 + a
  6
      a = Pi;
      b
  3 + Pi
The last answer is WRONG. b is definitly set to 6 and is NEVER 
recalculated when a is changed. This is so because we use a un-delayed 
assign.

Method 3 is even more dangerous:
      (* method 3: another way to use Dynamic *)
      Clear[a,b]
      a = 3;
      Dynamic[b = 3 + a]
  6
      a = Pi;  (* preceding ouptput changes to 3 + Pi *)
      b
  3 + Pi

The last answer is again wrong in a devious way. The correct value is 6. 
However, if you reevaluate b again, it is suddenly 3+Pi. The reason is, 
that the Dynamic statement is evaluated AFTER b has been printed. 
Therefore, b obtains its new value too late.

What can we learn from this is that Dynamic should be used for display 
jobs and not anything else. The right thing to do here is to use an 
delayed assign as in method 1.
cheers, Daniel

Am 20.05.2010 02:15, schrieb Murray Eisenberg:
> There IS a "simple" answer. Actually, two answers. it used to be that
> the only way to do this was to use SetDelayed ( := ) for the symbol you
> wanted to be recalculated whenever you changed another variable whose
> values was specified by Set ( = ).  Since Mathematica 6, you also have
> the more sophisticated method of using Dynamic quantities.
>
>      (* method 1: use SetDelayed instead of Set for b *)
>      a = 5;
>      b := 3 + a
>      b
> 8
>      a = Pi;
>      b
> 3 + Pi
>
>
>     (* method 2: use Dynamic *)
>     Clear[a,b]
>     Dynamic[a]
> a
>     a = 3;  (* preceding output changes to 3 *)
>     b = 3 + a
> 6
>     a = Pi;
>     b
> 3 + Pi
>
>     (* method 3: another way to use Dynamic *)
>     Clear[a,b]
>     a = 3;
>     Dynamic[b = 3 + a]
> 6
>     a = Pi;  (* preceding ouptput changes to 3 + Pi *)
>     b
> 3 + Pi
>
>
>
> On 5/19/2010 7:01 AM, Victor Roberts wrote:
>> I'm new to Mathematica, so perhaps there is a simple answer
>> to this question.
>>
>> How to I set Mathematica so that when I change the value
>> assigned to a variable it will automatically change all
>> later calculations that use that variable.
>>
>> For example, if I set
>>
>> a = 5
>>
>> and
>>
>> b = 3 + a
>>
>> I would like the value of b updated each time I change the
>> value of a.
>>
>> Right how, I need to recalculate each and every expression
>> that uses the variable a if I change its value.  There must
>> be a better way.
>>
>>
>> --
>> Vic Roberts
>> Replace xxx with vdr in e-mail address.
>>
>


-- 

Daniel Huber
Metrohm Ltd.
Oberdorfstr. 68
CH-9100 Herisau
Tel. +41 71 353 8585, Fax +41 71 353 8907
E-Mail:<mailto:dh at metrohm.com>
Internet:<http://www.metrohm.com>



  • Prev by Date: Re: How to Enable Automatic Recalculation
  • Next by Date: Re: ProgressIndicator inside DynamicModule
  • Previous by thread: Re: How to Enable Automatic Recalculation
  • Next by thread: Re: How to Enable Automatic Recalculation