Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2005
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

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

Search the Archive

Re: rootsearch in a piecewise function

  • To: mathgroup at smc.vnet.net
  • Subject: [mg60257] Re: rootsearch in a piecewise function
  • From: Peter Pein <petsie at dordos.net>
  • Date: Thu, 8 Sep 2005 06:47:52 -0400 (EDT)
  • References: <dfovrd$feo$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

juejung schrieb:
> hi group,
> 
> why does the root search in the following piecewise function not work,  
> when the plot function before evaluates just fine.
> if i use the /.para already at the point where i define f2 and f3 then the  
> root command works. however, the actual functions f2 and f3 are much  
> longer and i would like to replace parametervalues only at the point where  
> i do in the example below. it seems that findroot is evaluated before the  
> replacement takes place??
> 
> thanks
> juergen
> 
> para = {a -> 3, b -> 4, c -> 20, d -> 1.5};
> f2[x_] := 10 + a* x^(1/2) - x - b;
> f3[x_] := -6 + c/x + d^2;
> f1[x_] := Which[0 < x < b, f2[x], b <= x < 10, f3[x],10 <= x, x^(1/2)]  
> /.para;
> df1[x_] = D[f1[x], x];
> 
> Plot[f1[x] /.para, {x, 0.1, 15}]
> Plot[df1[x] /.para, {x,0.1, 15}]
> 
> FindRoot[{f1[x] == 0} /.para, {x, 2}]
> FindRoot[{df1[x] == 0} /.para, {x, 2}]
> 
Hi Juergen,

you'll have to map Evaluate at f1[x], because Which has Attribute
HoldAll. This means, without Evaluate, f1[x] contains only calls to f2
and f3. And the expression f2[x] does not contain any of your parameters.

Compare:

f1[x]

Which[0 < x < 4, f2[x], 4 <= x < 10], f3[x], 10 <= x, Sqrt[x]]

with

Evaluate /@ f1[x]

Which[0 < x < 4, 10 - b + a*Sqrt[x] - x, 4 <= x < 10], -6 + d^2 + c/x,
  10 <= x, Sqrt[x]]

FindRoot[Evaluate /@ f1[x]==0 /. para, {x, 5}] will find the root at
16/3. (The start value 2 leads the algorithm towards negative x-values,
where f is not defined).

and FindRoot[Evaluate /@ df1[x]==0 /. para, {x, 2}] gives you the
location of the maximum at 9/4.

-- 
Peter Pein, Berlin
GnuPG Key ID: 0xA34C5A82
http://people.freenet.de/Peter_Berlin/


  • Prev by Date: Re: rootsearch in a piecewise function
  • Next by Date: Simplify Expressions with Non commutative multiplication
  • Previous by thread: Re: rootsearch in a piecewise function
  • Next by thread: Re: Re: rootsearch in a piecewise function