Re: mathematica newbie trouble
- To: mathgroup at smc.vnet.net
- Subject: [mg99317] Re: mathematica newbie trouble
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Sat, 2 May 2009 06:02:07 -0400 (EDT)
On 5/1/09 at 5:52 AM, yangshuai at gmail.com (Guapo) wrote:
>i wrote the following mathematica code:
>s := (a + b + c)/2;
>k[a_, b_, c_] := Sqrt[s (s - a) (s - b) (s - c)];
>k[3, 4, 5]
>k[5, 9, 12]
>when run it, i can't get the write answer. but i change
>setDelayed(:=) to set(=), everything works ok
>s = (a + b + c)/2;
>k[a_, b_, c_] = Sqrt[s (s - a) (s - b) (s - c)];
>k[3, 4, 5]
>k[5, 9, 12]
>i did a google search for the difference of set and setDelayed,
>however, i still can't understand it for the upper described
>problem, could anyone explain it?
You would have gotten what you expected with SetDelayed had you
defined s as:
s[a_, b_, c_]:=(a + b + c)/2
When you write s:=(a+b+c)/2 you are telling Mathematica s is a
function of *global* variables. When you write k[a_,b_,c_]:= you
are telling Mathematica k a function of *local* variables. So,
given no global assignment made to a,b and c, s gets evaluated
to (a+b+c)/2 and is not evaluated further. But the other
instances of a,b, and c in the definition of k are assigned the
values supplied as arguments to k.
Use your version with SetDelayed and do the following:
In[16]:= a = b = c = 2;
k[m, n, p]
Out[17]= Sqrt[3] Sqrt[(3-m) (3-n) (3-p)]
Since, I set a,b and c to 2, s evaluates to 3. So, 3 appears
everywhere s is in the definition of k. Note:
In[18]:= k[3, 4, 5]
Out[18]= 0
Here s defined with global values of a,b and c gets evaluated to
3. And k uses the local value of a to be 3 per the definition.
So the term s-a gets evaluated to 0 causing the entire product
to be 0. Given the way s is used in k, I would have written the
code as
s = (a + b + c)/2;
k[a_, b_, c_] := Sqrt[s (s - a) (s - b) (s - c)]
or possibly
k[a_, b_, c_] := Block[{s}, Sqrt[s (s - a) (s - b) (s - c)]/.s
-> (a + b + c)/2]
Note, I have not used a semicolon to terminate the definition of
k using SetDelayed since there is no output to be suppressed.
That is the right hand side is not evaluated by definition when
k is defined using SetDelayed. Consequently, there is no output
to be suppressed.