Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2008

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

Search the Archive

Re: Package Problem

  • To: mathgroup at smc.vnet.net
  • Subject: [mg93883] Re: Package Problem
  • From: Albert Retey <awnl at gmx-topmail.de>
  • Date: Thu, 27 Nov 2008 05:35:32 -0500 (EST)
  • References: <ggjf00$lsg$1@smc.vnet.net>

Hi,

>   I have the following problem. I made a short Module to calculate the
> zeros of a given Function.I did this simply in the following way:
> 
> Nullstellen[f_, intervall_List] :=
>  Module[{func, startwerte, werte, vzwechsel, liste,
>    a = intervall[[1]], b = intervall[[2]]},
>   func = Function[x, Evaluate[f]];
>   werte = Table[x, {x, a, b, Abs[b - a]/100.}]; (* start-values *)
>   liste = ({#, func[x] /. x -> #} ) & /@ werte;
>   vzwechsel =    Select[Split[liste, (Sign[Last[#1]] == -Sign[Last
> [#2]]) &],  Length[#] == 2 &]; (* Sign Change*)
>   startwerte = Map[First, vzwechsel, {2}];
>   Map[FindRoot[func[x] == 0, {x, #[[1]], #[[2]]}] &, startwerte]
>   ]
> 
> This works fine, but when I copy exactly this code in my own
> package... it works not. I get an output like this:
> 
> Nullstellen[x^2 - 2, {-2, 2}]
> 
> {{-2.,-2+x^2},{-1.8,-2+x^2},{-1.6,-2+x^2},{-1.4,-2+x^2},{-1.2,-2+x^2},
> \
> {-1.,-2+x^2},{-0.8,-2+x^2},{-0.6,-2+x^2},{-0.4,-2+x^2},{-0.2,-2+x^2},
> {\
> 1.11022*10^-16,-2+x^2},{0.2,-2+x^2},{0.4,-2+x^2},{0.6,-2+x^2},{0.8,-2+
> \
> x^2},{1.,-2+x^2},{1.2,-2+x^2},{1.4,-2+x^2},{1.6,-2+x^2},{1.8,-2+x^2},
> {\
> 2.,-2+x^2}}
> 
> So the mapping of the function onto the values does not work.
> 
> Can anyone explain the reason (and give me a hint how I can manage
> this function to work within a package).

I have not tested it but am quite sure that the problem is that the x
within your package is created in the private context of your package,
while the  x you use in the function call is in the Global` context,
that is they are different symbols. There are various ways to solve the
problem, but the simplest and also the one which is following the
conventions of the built in functions (compare Integrate or Plot) is to
pass the symbol as an additional argument, e.g. define:

Nullstellen[expr_, {x_Symbol, a_, b_}] := Module[{
   func, startwerte, werte, vzwechsel, liste
   },
  werte = Table[x, {x, a, b, Abs[b - a]/100.}];(*start-values*)
  liste = ({#, expr /. x -> #}) & /@ werte;
  vzwechsel = Select[
    Split[liste, (Sign[Last[#1]] == -Sign[Last[#2]]) &],
    Length[#] == 2 &
    ];(*Sign Change*)
  startwerte = Map[First, vzwechsel, {2}];
  Map[FindRoot[expr == 0, {x, #[[1]], #[[2]]}] &, startwerte]
  ]



hth,

albert (from cold but sunny Austria :-)


> Mike from cold an rainy Germany
> 


  • Prev by Date: Re: A problem in Pi digits as Lattice space filling
  • Next by Date: Re: financial chart with volumes
  • Previous by thread: RE: Package Problem
  • Next by thread: Re: Package Problem