Re: Preventing LegendreP from self-extracting in manipulations

*To*: mathgroup at smc.vnet.net*Subject*: [mg57865] Re: Preventing LegendreP from self-extracting in manipulations*From*: "Carl K. Woll" <carlw at u.washington.edu>*Date*: Fri, 10 Jun 2005 02:29:40 -0400 (EDT)*Organization*: University of Washington*References*: <d893ok$svp$1@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

"Vladislav" <kazimir04 at yahoo.co.uk> wrote in message news:d893ok$svp$1 at smc.vnet.net... > Hi, all, > > I have already tried to post the message, but it went lost. I repeat it > as a new therad. > > Can somebody help me with the following. I need present some functions > (prolate spheroidal functions) in the basis of the Legendre > polynomials. I.e. > I have functions like > > FF1 = 0.6 LegendreP[5, #1] + 0.7 LegendreP[6, #1] & > FF2 = 0.3 LegendreP[5, #1] + 0.2 LegendreP[6, #1] & > > I want to manipulate these functions and remain in the basis of prolate > functions. > For example I want to create a linear combination of functions, or > something like this. > > FF = .2FF1[#1] + .3FF2[#1] & > > It works well from the point of view of finding the numerical result, > but it do not give > the presentaion of the function in the basis of the Legendre > polynomials > > I would like to have create a function which would give the result like > > FFX = 0.9 LegendreP[5, #1] + 0.9 LegendreP[6, #1] &, so that I could > see the presentaion > of the function by typing FFX and obtaining 0.9 LegendreP[5, #1] + 0.9 > LegendreP[6, #1] &. > In practice these functions contain much more terms and having the form > like > 0.9 LegendreP[5, #1] + 0.9 LegendreP[6, #1] & is very important. In > the same way > I would not like to have the explicit presentation as plolinomials, > like -0.28125+ > 1.6875 w + 5.90625 w^2 + .. because of loss of accuracy for future > results. > > Sincerely, > > Vladislav > Vladislav, How about introducing a framework, a la InterpolatingFunction. For example, let's call the framework lsFunction, where ls is shorthand for Legendre Series. lsFunction takes a single argument, the list for the coefficients of the LegendreP polynomials, and returns a function. I used a regular function instead of a pure function so that I can make sure the explicit LegendreP polynomials are never expanded out. Define rule for numeric input: lsFunction[c_][x_?NumericQ] := c . LegendreP[Range[0, Length[c] - 1], x] Define rules for adding lsFunctions: lsFunction /: lsFunction[c1_] + lsFunction[c2_] := lsFunction[Total[PadRight[{c1, c2}, {2, Max[Length[c1], Length[c2]]}]]] lsFunction /: lsFunction[c1_][x_] + lsFunction[c2_][x_] := lsFunction[Total[PadRight[{c1, c2}, {2, Max[Length[c1], Length[c2]]}]]][x] Define rules for multiplying by a scalar: lsFunction /: a_?NumericQ lsFunction[c_] := lsFunction[a c] lsFunction /: a_?NumericQ lsFunction[c_][x_] := lsFunction[a c][x] Define rules for formatting: Format[lsFunction[c_List]] := lsFunction["<>"] Format[lsFunction[c_][x_]] := c . Table[Subscript[P, n][x], {n, 0, Length[c] - 1}] For your examples, we would have: In[40]:= FF1 = lsFunction[{0, 0, 0, 0, 0, .6, .7}] FF2 = lsFunction[{0, 0, 0, 0, 0, .3, .2}] Out[40]= lsFunction["<>"] Out[41]= lsFunction["<>"] Now, we can do things like taking linear combinations of lsFunctions: In[42]:= FF=.2FF1+.3FF2 Out[42]= lsFunction["<>"] Let's apply FF to a variable In[43]:= FF[x] Out[43]= 0.21 Subscript[P, 5][x] + 0.2 Subscript[P, 6][x] We see that the LegendreP polynomials (the Subscript[P,_] will look better in the Front End) haven't been expanded out. If instead we apply FF to a number, we get: In[44]:= FF[.1] Out[44]= -0.0122118 You can also do other things like define rules for multiplying two lsFunctions, or integration and differentiation. Carl Woll Wolfram Research