Re: Package Problem

*To*: mathgroup at smc.vnet.net*Subject*: [mg93930] Re: Package Problem*From*: "m.g." <mg at michaelgamer.de>*Date*: Fri, 28 Nov 2008 07:11:51 -0500 (EST)*References*: <ggjf00$lsg$1@smc.vnet.net> <gglt56$8ne$1@smc.vnet.net>

On 27 Nov., 11:35, Albert Retey <a... at gmx-topmail.de> wrote: > Hi, > > > > > I have the following problem. I made a short Module to calculate th= e > > 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]] == -Si= gn[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 Thank you Alfred, with the hints of David and you I saw it immidiately. I now realized it according to your suggestions and it works fine - AND folllows the conventions of Mathematica standard functions :-) Greetings (now also from cold and sunny Germany ) Mike