|
[Date Index]
[Thread Index]
[Author Index]
Re: How to Enable Automatic Recalculation
- To: mathgroup at smc.vnet.net
- Subject: [mg109895] Re: How to Enable Automatic Recalculation
- From: Murray Eisenberg <murray at math.umass.edu>
- Date: Fri, 21 May 2010 06:47:06 -0400 (EDT)
Method 1's final result as I showed it is indeed dead wrong, due to an
unfortunate copy-and-paste; thanks for catching that.
But I see nothing "wrong" in method 2. I just checked the results
against evaluation of the input lines shown (one per input cell) in a
fresh Mathematica 7.0.1 notebook. But I don't deny there are potential
pitfalls.
I suspected that the O.P. was interested in something more complicated
than the simple arithmetic example he used in his query.
So I wanted to suggest the possibility that the sort of thing he was
looking for could be treated by Dynamic, and not just SetDelayed.
On 5/20/2010 6:39 AM, dh wrote:
> 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.
>>>
>>
>
>
--
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: How to Enable Automatic Recalculation
Next by Date:
Re: data in absolutetime
Previous by thread:
Re: How to Enable Automatic Recalculation
Next by thread:
Re: How to Enable Automatic Recalculation
|