Re: Re: Problem with the GaussianQuadratureWeights[n,a, b]
- To: mathgroup at smc.vnet.net
- Subject: [mg26465] Re: [mg26444] Re: Problem with the GaussianQuadratureWeights[n,a, b]
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Thu, 21 Dec 2000 22:46:49 -0500 (EST)
- Organization: Universitaet Leipzig
- References: <91pjn3$5vp@smc.vnet.net> <200012210651.BAA08643@smc.vnet.net> <p05010404b667d7cf36e3@[128.165.240.102]>
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
GaussianQuadrature[] computes the "weights" by the evaluation of
LegendreP[]. It is a well known fact that the numerical computation of
LegendreP[n,x] for high precision x (>16) is broken in Mathematica 4.0.x
You can check this by
In[]:=LegendreP[3, 0.5]
Out[]=-0.4375
In[]:=LegendreP[3, 0.5`30]
Out[]=-0.07291666666666666666666666667
You can fix this by adding
Unprotect[LegendreP]
LegendreP[n_, x_?NumericQ] /; Precision[x] > 16 :=
Module[{u, p}, p = LegendreP[n, u]; p /. u -> x]
Protect[LegendreP]
to your init.m file.
and now
GaussianQuadratureWeights[7, -1, 1, 20]
gives the correct result.
In my first answer I don't think about it,
because I have the feature-fix in my
init.m since version 4.0 came out.
You can still compute the weights by
GWeights1[n_Integer, a_, b_, prec_Integer] :=
Module[{x, xi, q, m},
xi = Sort[N[Solve[LegendreP[n, x] == 0, x], prec]] /.
Complex[r_, i_] :> r;
q = Integrate[LegendreP[n - 1, x]*LegendreP[n - 1, x], {x, -1, 1}];
wfac = {x, q/(LegendreP[n - 1, x]*D[LegendreP[n, x], x])} /. xi;
q = Plus @@ (Last /@ wfac);
{((b - a)*#[[1]] + (a + b))/2, 2*#[[2]]/q} & /@ wfac
]
or
GWeights2[n_Integer, a_, b_, prec_Integer] :=
Module[{x, xi, q, m},
xi = Sort[N[Solve[LegendreP[n, x] == 0, x], prec]] /.
Complex[r_, i_] :> r;
m = Table[LegendreP[i, x], {i, 0, n - 1}] /. xi;
{((b - a)*#[[1]] + (a + b))/2, (b - a)*#[[2]]/2} & /@
Transpose[{ x /. xi,
LinearSolve[Transpose[m],
Prepend[Table[0, {n - 1}],
Integrate[LegendreP[0, x], {x, -1, 1}]]]}]
]
both function evaluate LegendreP[] with symbolic x (that
work correct in version 4.0.x) and
replace it later by the numerical values.
Hope that helps
Jens
Cheng Liu wrote:
>
> Thank you Jens,
>
> By setting the precision higher than the default (16) solve the
> problem described in my previous post. But another problem appears,
>
> In[9]:=
> GaussianQuadratureWeights[7, 0, 1, 20]
> Out[9]=
> \!\({{0.0254460438286207377369051579760743056`24.7499,
> 0.08184679159616065512531181311972918224`22.9004}, \
> {0.1292344072003027800680676133596057328`25.5629,
> 0.176800361948499354889282418503202`22.9376}, \
> {0.2970774243113014165466967939615192127788252`26.1861,
> 0.241352841905111882955195047583155`22.9492}, {1\/2,
> 9.1004562140604214415812457652156224`23.0189*^-9}, \
> {0.70292257568869858345330320603848078722`26.5602,
> 0.241352841905111882955195047583156`22.9064}, \
> {0.8707655927996972199319323866403942672`26.3914,
> 0.176800361948499354889282418500441`22.3581}, \
> {0.9745539561713792622630948420239256944`26.3331,
> 0.081846791596160655125311813120987`22.4951}}\)
>
> Note the point at x=1/2, w is almost zero, which should be around 0.2.
>
> Another observation is that GaussianQuadratureWeights[7, 0, 1, 20] and
> GaussianQuadratureWeights[7, 0, 1] give different answers to the weight
> w. Any help would be appreciated. Thanks.
>
> Cheng
- References:
- Re: Problem with the GaussianQuadratureWeights[n, a, b]
- From: Jens-Peer Kuska <kuska@informatik.uni-leipzig.de>
- Re: Problem with the GaussianQuadratureWeights[n, a, b]