Re: questions about delayed expression.

*To*: mathgroup at smc.vnet.net*Subject*: [mg19906] Re: [mg19862] questions about delayed expression.*From*: "Wolf, Hartmut" <hwolf at debis.com>*Date*: Tue, 21 Sep 1999 02:22:44 -0400*Organization*: debis Systemhaus*References*: <199909190520.BAA10204@smc.vnet.net.>*Sender*: owner-wri-mathgroup at wolfram.com

Wen-Feng Hsiao schrieb: > > The following is the process that I run in my notebook. > > In[1]:= > a[x_] := x + 4 > b[x_] := -3 x + 8 > > In[2]:= > sola = x /. Solve[{a[x] == c}, x]; > solb = x /. Solve[{b[x] == c}, x]; > > In[3]:= > Inter[c_] := Interval[{sola[[1]], solb[[1]]}] > > In[4]:= > Inter[.3] > Inter[.4] > > Out[4]= > \!\(Interval[{\(-4\) + c, \(8 - c\)\/3}]\) > > Out[5]= > \!\(Interval[{\(-4\) + c, \(8 - c\)\/3}]\) > > My questions are: > 1. Why Inter[.3] and Inter[.4] cannot be evaluated? Their results should > not be the same. This is not my intention. > > 2. I don't know if there is any better way to extract the 'root(s)' from > the output of 'Solve' command. The output form is {{x->root1}, {x- > >root2}, ...{}}. If I use 'ReplaceAll'(/.) command, it will remain a list > of solutions of x. It seems I can only use element operation to extract > the root(s) from the solution list? In my case, I use sola[[1]] and > solb[[1]]. > > Please give me suggestions. Thanks for your help. Dear Hsiao, To question (1.) look at your definition of "Inter", it is SetDelayed and doesn't contain the pattern variable c explicitly at the rhs. So when you evaluate Inter[.4] then there is no c on the rhs to be substituted into, and when -- _after_ that -- the rhs is being evaluated, and c shows up then it hasn't got a value, esp. not 0.4! So you end up with Out[5] (which is the same as Out[4]). To get what you want, define inter1[c_] = Interval[{sola[[1]], solb[[1]]}] or inter2[c_] := Evaluate[Interval[{sola[[1]], solb[[1]]}]] There are still other methods to feed in the actual value of c (e.g. if you definitely need the delayed evaluation of sola, solb, perhaps because you happen to redefine them in course of your calculation), e.g. inter3[cThis_] := Block[{c = cThis}, Interval[{sola[[1]], solb[[1]]}]] In your case they all give Interval[{-3.6, 2.53333}], and Interval[{-3.7, 2.56667}] for 0.4 and 0.3 respectively. For (2.) you could use (since you have exactly one solution in each case, else you have to make a selection) e.g. Interval[Flatten[x /. {Solve[{a[x] == c}, x], Solve[{b[x] == c}, x]}, 1]] but there are dozens of ways to arrive at that. Kind regards, hw

**References**:**questions about delayed expression.***From:*d8442803@student.nsysu.edu.tw (Wen-Feng Hsiao)