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)
- questions about delayed expression.