Descargar

Polinomios de Legendre

Enviado por Aladar Peter Santha


Partes: 1, 2

    Definición (de Olinde Rodrigues): El polinomio de Legendre de grado n se define de la manera siguiente:

    edu.red (1)

    edu.red

    Puesto que edu.rededu.redy teniendo en cuenta que la derivada de orden cero de una función es la función misma, resulta que

    edu.redy edu.red (2)

    Teorema 1: Los polinomios de Legendre verifican la relación:

    edu.red (3)

    Demostración: Notando edu.redse calcula la derivada de orden edu.redde edu.redutilizando la fórmula de Leibniz:

    edu.red (4)

    Resulta que:

    edu.red (5)

    Por otra parte,

    edu.red

    edu.red

    edu.red (6)

    Igualando los resultados (5) y (6), se obtiene que

    edu.red

    edu.red (7)

    Ahora, utilizando las relaciones (1) y (7) y la regla de Leibniz, resulta que:

    edu.red

    edu.red

    edu.red

    , es decir,

    edu.red

    Al dividir ambas partes de esta última igualdad entreedu.redresulta que

    edu.red

    , es decir,

    edu.red

    La fórmula de recurrencia (3) permite calcular cómodamente los coeficientes de los polinomios de Legendre, a partir de los coeficientes de edu.redPor ejemplo, si edu.redla relación (3) se transforma en:

    edu.red

    , de donde, teniendo en cuenta a (2), resulta que

    edu.red

    Para calcular a edu.redse procede de la misma manera. Poniendo edu.reden la relación (3)

    , se obtiene que:

    edu.red

    , de donde, teniendo en cuenta las expresiones de edu.redy edu.redresulta que

    edu.red

    Continuando así, se obtienen los resultados siguientes:

    edu.red

    edu.red

    edu.red (8)

    edu.red

    edu.red

    Lema 1: Cualquier producto de edu.rednúmeros naturales consecutivos es un múltiplo de edu.red

    Demostración: Si edu.redhay que demostrar que el producto

    edu.red

    , es un múltiplo de edu.red. La demostración se hace por recurrencia respecto al número de los factores en el producto.

    Obviamente, el lema se cumple en el caso de un producto de dos factores consecutivos

    edu.red

    , puesto que en este caso uno de los factores es par y por tanto es divisible por edu.redSupongamos ahora que el lema se cumple para los productos de p factores. Así

    edu.red

    , es un múltiplo de edu.redPara que el lema sea verdadero para un número cualquiera de factores, hay que demostrar que el producto de edu.redfactores

    edu.red

    , es un múltiplo de edu.redSe observa que,

    edu.red

    , es decir,

    edu.red.

    Dado que edu.redes múltiplo de edu.rededu.redserá múltiplo de edu.redPor tanto, edu.redes múltiplo de edu.redsi, y solamente si, edu.redlo es.

    Con otras palabras,

    edu.red

    , donde edu.redsignifica que edu.redes múltiplo de edu.red

    Así,

    edu.red

    Dado que edu.redes múltiplo de edu.redde las equivalencias anteriores resulta que edu.redlo es también, y así el lema queda demostrado.

    Lema 2: Todos los coeficientes del polinomio edu.redson múltiplos deedu.red

    Demostración: Dado que edu.redes un polinomio de grado edu.red

    edu.red

    , y así

    edu.red

    Teniendo en cuenta que todos los coeficientes de edu.redson productos de edu.rednúmeros naturales consecutivos, según el lema 1 resulta que sus coeficientes son múltiplos de edu.red

    Para el cálculo de los polinomios de Legendre por programa no es conveniente determinar los coeficientes de edu.redpuesto que, según el lema 2, estos son múltiplos de edu.redy así, crecen de manera muy rápida con el aumento de edu.redPor este razón, es conveniente buscar una fórmula de recurrencia para el cálculo de

    edu.red

    Obviamente, según (3),

    edu.red (9)

    , donde edu.redy edu.redEl procedimiento siguiente, que utiliza la fórmula (9), sirve para el cálculo de los polinomios de Legendre, hasta el grado 24:

    Public Function CalPolLegendre(ByVal g) As String

    Dim i As Integer, p As Double, y() As Double, z() As Double

    Dim res As String, res0 As String, rc As String

    ReDim z(g)

    rc = Chr$(13) + Chr$(10)

    y() = PolLeg(g)

    For i = 0 To g

    z(i) = y(i)

    Next i

    p = y(g + 1)

    res = "Polinomio de Legendre de grado " + Str$(g)

    res = res + ", multiplicado por: " + "2^" + Str$(p)

    res0 = FormatoPol(z())

    res = res + rc + rc + res0

    CalPolLegendre = res

    End Function

    ' ———————————————————————————

    Public Function PolLeg(ByVal g As Integer) As Variant

    If g > 24 Then

    MsgBox "El grado tiene que ser menor que 25"

    End

    End If

    Dim i As Integer, j As Integer, k As Integer, res0 As String

    Dim sw As Integer, y() As Double, res As String, rc As String

    Dim a() As Double, b() As Double, t() As Double

    If g < 3 Then

    If g = 0 Then

    ReDim y(1): y(0) = "1": y(1) = "0"

    End If

    If g = 1 Then

    ReDim y(2)

    y(0) = "1": y(1) = "0"

    End If

    If g = 2 Then

    ReDim y(3): y(0) = "3": y(1) = "0": y(2) = "-1": y(3) = "1"

    End If

    PolLeg = y()

    Exit Function

    End If

    ReDim a(g), b(g + 1), t(g – 1, g + 1), y(g + 1)

    rc = Chr$(13) + Chr$(10): p = g

    t(0, 0) = 0: t(0, 1) = 2 'Coeficiente de 2* L1(x)

    t(1, 0) = -2: t(1, 1) = 0: t(1, 2) = 6 ' Coeficientes de 2*L2(x)

    For i = 2 To g – 1

    For j = 0 To g

    If j <> g – 1 Then

    a(j) = -4 * i * t(i – 2, j)

    End If

    b(j + 1) = (4 * i + 2) * t(i – 1, j)

    b(j) = b(j) + a(j)

    Next j

    For k = 0 To i + 1

    t(i, k) = b(k) / (i + 1)

    b(k) = 0

    Next k

    Next i

    For i = 1 To g

    For j = 0 To g

    If Int(t(g – 1, j) / 2) <> t(g – 1, j) / 2 Then

    sw = 1: Exit For

    End If

    Next j

    If sw = 1 Then

    Exit For

    End If

    p = p – 1

    For j = 0 To g

    t(g – 1, j) = t(g – 1, j) / 2

    Next j

    Next i

    For i = 0 To g

    y(i) = t(g – 1, g – i)

    Next i

    y(g + 1) = p

    PolLeg = y()

    End Function

    ' ———————————————————————————

    Public Function FormatoPol(ByRef x() As Double) As Variant

    Dim i As Integer, gx As Integer, ax As String, cx As String

    gx = UBound(x())

    For i = 0 To gx

    If x(i) <> 0 Then

    If i = 0 Then

    If Abs(x(0)) <> 1 Then

    If x(0) < 0 Then

    cx = Str$(x(0))

    Else

    cx = Mid$(Str$(x(0)), 2)

    End If

    Else

    If gx <> 0 Then

    If x(0) = -1 Then

    cx = "-"

    End If

    Else

    If x(0) = -1 Then

    cx = Str$(-1)

    Else

    cx = Mid$(Str$(1), 2)

    End If

    End If

    End If

    If gx <> 0 Then

    If gx = 1 Then

    cx = cx + " X"

    Else

    cx = cx + " X^" + Mid$(Str$(gx), 2)

    End If

    End If

    Else

    If x(i) > 0 Then

    ax = " + "

    Else

    ax = " – "

    End If

    If Abs(x(i)) <> 1 Or i = gx Then

    ax = ax + Mid$(Str$(x(i)), 2)

    End If

    If gx > 1 Then

    If i < gx – 1 Then

    ax = ax + " X^"

    ax = ax + Mid$(Str$(gx – i), 2)

    Else

    If i = gx – 1 Then

    ax = ax + " X"

    End If

    End If

    End If

    cx = cx + ax: ax = ""

    End If

    End If

    Next i

    FormatoPol = cx

    End Function

    Utilizando el procedimiento anterior se obtienen los resultados (8) y se pueden calcular los coeficientes para más polinomios de Legendre de grados menores que 25:

    edu.red

    edu.red

    edu.red edu.red

    Para hallar polinomios de Legendre de grado muy grande, hay que utilizar los programas para operar con enteros extra-largos [4]. En este caso el código a utilizar es el siguiente:

    Public Function CalPLegNG(ByVal g As Integer) As String

    Dim i As Integer, pg As String, y() As String, z() As String

    Dim res As String, res0 As String, rc As String

    ReDim z(g)

    rc = Chr$(13) + Chr$(10)

    y() = PolLegNG(g)

    For i = 0 To g

    z(i) = y(i)

    Next i

    pg = y(g + 1)

    res = "Polinomio de Legendre de grado " + Str$(g)

    res = res + ", multiplicado por: " + "2^" + pg

    res0 = FormatoPolLegNG(z())

    res = res + rc + rc + res0

    CalPLegNG = res

    End Function

    ' ———————————————————————————

    Public Function PolLegNG(ByVal g As Integer) As Variant

    Dim i0 As Integer, i1 As Integer, j0 As Integer, sw1 As Integer, w4 As Integer

    Dim w3 As String, q() As String, s() As String, t() As String, rr() As String

    Dim x0() As String, x(2) As String, res As String, res0 As String, rc As String

    Dim n As Integer, pq As Integer

    If g < 3 Then

    If g = 0 Then

    ReDim x0(1): x0(0) = "1": x0(1) = "0"

    End If

    If g = 1 Then

    ReDim x0(2)

    x0(0) = "1": x0(1) = "0"

    End If

    If g = 2 Then

    ReDim x0(3): x0(0) = "3": x0(1) = "0": x0(2) = "-1": x0(3) = "1"

    End If

    PolLegNG = x0()

    Exit Function

    End If

    ReDim q(g), s(g + 1), t(g – 1, g + 1)

    n = 7: t(0, 1) = "2": pg = g

    t(1, 0) = "-2": t(1, 1) = "0": t(1, 2) = "6"

    rc = Chr$(13) + Chr$(10): sw1 = 0

    For i0 = 2 To g – 1

    For j0 = 0 To g

    If j0 <> g – 1 Then

    x(1) = Str$(-4 * i0): x(2) = t(i0 – 2, j0)

    q(j0) = Multiplicar(x(), n)

    End If

    x(1) = Mid$(Str$(4 * i0 + 2), 2)

    x(2) = t(i0 – 1, j0)

    s(j0 + 1) = Multiplicar(x(), n)

    x(1) = s(j0): x(2) = q(j0)

    s(j0) = Sumar(x(), n)

    Next j0

    For i1 = 0 To i0 + 1

    x(1) = s(i1): x(2) = Mid$(Str$(i0 + 1), 2)

    rr() = DivisionEuclidea(x(), n)

    t(i0, i1) = rr(1)

    s(i1) = "0"

    Next i1

    Next i0

    For i0 = 1 To g

    For j0 = 0 To g

    w3 = Right$(t(g – 1, j0), 1)

    x(1) = w3: x(2) = 2: rr() = DivisionEuclidea(x(), n): w4 = rr(2)

    If w4 <> 0 Then

    sw1 = 1: Exit For

    End If

    Next j0

    If sw1 = 1 Then

    Exit For

    End If

    pg = pg – 1

    For j0 = 0 To g

    x(1) = t(g – 1, j0): x(2) = "2"

    rr() = DivisionEuclidea(x(), n)

    t(g – 1, j0) = rr(1)

    Next j0

    Next i0

    ReDim x0(g + 1)

    For i = 0 To g

    x0(i) = t(g – 1, g – i)

    Next i

    x0(g + 1) = Str$(pg)

    PolLegNG = x0()

    End Function

    ' ———————————————————————————

    Public Function FormatoPolLegNG(ByRef x0() As String) As String

    Dim i As Integer, gx As Integer, ax As String, cx As String

    gx = UBound(x0())

    For i = 0 To gx

    If x0(i) <> "0" Then

    If i = 0 Then

    If x0(0) <> "1" And x0(0) <> "-1" Then

    cx = x0(0)

    Else

    If gx <> 0 Then

    If x0(0) = "-1" Then

    cx = "-"

    End If

    Else

    If x0(0) = "-1" Then

    cx = Str$(-1)

    Else

    cx = Mid$(Str$(1), 2)

    End If

    End If

    End If

    If gx <> 0 Then

    If gx = 1 Then

    cx = cx + " X"

    Else

    cx = cx + " X^" + Mid$(Str$(gx), 2)

    End If

    End If

    Else

    If Left$(x0(i), 1) = "-" Then

    ax = " – "

    Else

    ax = " + "

    End If

    If (x0(i) <> "1" And x0(i) <> "-1") Or i = gx Then

    If Left$(x0(i), 1) = "-" Then

    ax = ax + Mid$(x0(i), 2)

    Else

    ax = ax + x0(i)

    End If

    End If

    If gx > 1 Then

    If i < gx – 1 Then

    ax = ax + " X^"

    ax = ax + Mid$(Str$(gx – i), 2)

    Else

    If i = gx – 1 Then

    ax = ax + " X"

    End If

    End If

    End If

    cx = cx + ax: ax = ""

    End If

    End If

    Next i

    FormatoPolLegNG = cx

    End Function

    Haciendo los cálculos con el código anterior se obtiene, por ejemplo, el resultado siguiente:

    edu.red

    edu.red

    Teorema 2: Cualquiera que sea edu.rededu.red (10)

    Según las igualdades (2), la propiedad se cumple para edu.redSuponiendo que se cumple para edu.redsegún la fórmula de recurrencia (3) resulta que

    edu.red

    Lema 3: Si la función edu.redes derivable y par (impar) su derivada edu.redes impar (par).

    En efecto, si edu.red, entonces según la regla de derivación de las funciones compuestas

    edu.red

    , es decir

    edu.red

    Si edu.redes impar,

    edu.red

    , es decir

    edu.red

    Lema 4: si edu.redes una función par edu.redderivable y edu.redes su dominio de definición, entonces según el lema 3

    edu.red

    En efecto, si edu.redes una función par entonces edu.redes impar, edu.redes par, edu.redes impar, edu.redes par, edu.redes impar edu.redes par, edu.redes impar. Así el lema 4 queda demostrado.

    Teorema 3: Cualquiera que sea edu.red

    edu.red (11)

    Demostración: El caso edu.redresulta de la definición1. Si edu.redy teniendo en cuenta que la función edu.redes una función par, según el lema 4 resulta que

    edu.red

    , es decir

    edu.red

    Consecuencia: Puesto que según el teoremas 2 edu.reddel teorema 3 resulta que

    edu.red

    Teorema 4: Cualquiera que sea edu.rededu.red

    Según las igualdades (2), la propiedad se cumple para edu.redDerivando la fórmula de recurrencia (3) resulta que

    edu.red (12)

    Suponiendo que el teorema se cumple para edu.redy poniendoedu.reden la igualdad (12) se obtiene que

    edu.red

    edu.red

    edu.red

    edu.red

    edu.red

    edu.red

    Así el teorema queda demostrado.

    Lema 5: Si edu.redy edu.redentonces

    edu.red (13)

    Demostración: Dado que 1 y 1 son raíces de orden n para edu.redy teniendo en cuenta que edu.redresulta que 1 y 1 seguirán siendo raíces de edu.redIntegrando por partes,

    edu.red

    , resulta que se verifica la igualdad (12), puesto que

    edu.red

    Teorema 5: Si edu.redes el polinomio de Legendre de grado edu.redy Q es una función polinomio de grado menor que edu.redentonces

    edu.red (14)

    Demostración: Puesto que la función polinomio Q es combinación lineal de las funciones polinomios edu.redes suficiente demostrar que

    edu.red

    , donde edu.redAplicando kveces sucesivamente el lema 5, y teniendo en cuenta que edu.redse obtiene que

    edu.red

    edu.red

    ………………………………………………………….

    edu.red

    Dado que, 1 y 1 son ceros de orden edu.redde edu.red, 1 y 1 serán ceros también edu.redy así

    edu.red

    Por tanto edu.redy el teorema queda demostrado.

    Observación 1: Si edu.redy edu.redentonces

    edu.red (15)

    En efecto, suponiendo que en el teorema anterior edu.redresulta que la integral (14) es una combinación lineal la de integrales del tipo (14) que son todas nulas.

    Teorema 6: Si edu.redes el polinomio de Legendre de grado n, entonces

    edu.red (16)

    Demostración: De la definición (1) de los polinomios de Legendre resulta que

    edu.red

    , donde

    edu.red (17)

    Así,

    edu.red (18)

    , puesto que, según el teorema 5, los integrales que contienen edu.redson nulos. Por otra parte, sustituyendo a edu.redpor edu.reden la fórmula de recurrencia (3), se obtiene que

    edu.red

    , y así

    edu.red (19)

    Dado que, según el teorema 5, la segunda integral en la expresión de edu.redes cero, resulta que

    edu.red (20)

    Es fácil comprobar que edu.redy así edu.red, cualquiera que sea edu.reden N*. Según (20),

    edu.red

    , y así

    edu.red (21)

    Ahora, de (16) y (18) resulta que

    edu.red

    edu.red

    , donde

    edu.red, edu.red

    Observación 2: En el espacio vectorial edu.redde las funciones polinomio de grado menor o igual que edu.redel producto escalar de edu.redse puede definir de la manera siguiente:

    edu.red (22)

    , y por tanto

    edu.red

    Si las funciones edu.redse definen por

    edu.red

    , entonces, según la observación1 y el teorema 4, las funciones edu.rededu.redforman una base orto-normal de edu.redlo que quiere decir que

    edu.red

    Ahora se puede considerar la seria Fourier asociada a la función edu.red

    edu.red (23)

    Para que pueda tener lugar la igualdad

    edu.red (24)

    , es preciso determinar los coeficientes de Fourier edu.redteniendo en cuenta que las funciones edu.rededu.redforman un sistema orto-normal sobre el intervalo edu.red

    edu.red

    , es decir

    edu.red edu.red (25)

    En la teoría general de las series Fourier se demuestra que si la función edu.redcumple ciertas condiciones sobre el intervalo edu.redentonces la serie Fourier con los coeficientes (23) converge a edu.red

    Ejercicio 1: Calcular la integral

    edu.red

    De la relación de recurrencia (3) resulta que

    edu.red

    , y así

    edu.red

    Según la observación 1, la primera integral es nula, luego, según el teorema 6, la segunda integral vale . Por tanto,

    edu.red

    Ejercicio 2: Calcular la integral:

    edu.red

    Sustituyendo en la fórmula de recurrencia (3) edu.redpor edu.red

    edu.red

    , de donde resulta que

    edu.red

    Continuando con el mismo tipo de razonamiento que en el ejercicio anterior, se obtiene que

    edu.red

    Teorema 7: En el intervalo edu.redel polinomio edu.redtiene edu.redceros reales.

    Demostración: Obviamente 1 y 1 son ceros de orden edu.redde la función

    edu.red

    , y así 1 y 1 son ceros también para sus derivadas, hasta la derivada de orden edu.redinclusive:

    edu.red

    edu.red

    Sea edu.redla propiedad de que una función tiene por lo menos edu.redceros en el intervalo edu.redy sea edu.redPuesto que edu.redse anula para edu.redresulta que edu.redSi edu.redentonces existen edu.redtal que

    edu.red, edu.rededu.red

    Aplicando ahora el teorema de Rolle para la función edu.reden losedu.redintervalos

    edu.red

    , resultará que edu.redse anulará por lo menos una vez en el interior de cada uno de estos intervalos. Por tanto edu.redAsí edu.redy la función edu.redtendrá la propiedad edu.redTeniendo en cuenta que la función edu.redes un polinomio de grado edu.redy que no puede tener más que edu.redceros, resulta que resulta que edu.redtendrá exactamente edu.redceros reales distintos, situados en el intervalo edu.red

    Observación 3: De la relación (11) resulta que la función edu.redes par o impar, según que edu.redes un número par o impar, respectivamente. En los dos casos, los ceros de edu.redserán dispuestas de manera simétrica en el intervalo edu.redes decir, si edu.redson los ceros de edu.reden orden creciente, entonces

    edu.red (26)

    , cualquiera que sea i, tal que edu.redSi edu.redes impar, es decir edu.redentonces para edu.reden la relación (26) resulta que edu.redes decir edu.red

    El código siguiente permite calcular los ceros de los polinomios de Legendre de grado menor que 25 y se exponen los 14 decimales después del punto decimal.

    Public Function CerosPolLeg(ByVal g) As String

    Dim i As Integer, y() As Double, z() As Double

    Dim ceros() As Double, rr() As Double, m As Integer, st As Double

    Dim res As String, rc As String, n1 As Integer, g1 As Integer

    If g = 0 Then

    CerosPolLeg = "¡P0 no tiene ceros!"

    Exit Function

    End If

    If g = 1 Then

    CerosPolLeg = "El único cero de P1 es x = 0"

    Exit Function

    End If

    rc = Chr$(13) + Chr$(10): g1 = Int(g / 2): st = 0.013

    ReDim z(g), ceros(g1)

    y() = PolLeg(g)

    For i = 0 To g: z(i) = y(i): Next i

    Do

    rr() = Rastreo(z(), 0, 1, st)

    n1 = UBound(rr())

    If rr(n1, 1) <> 0 Then

    Exit Do

    Else

    st = st * 0.13

    End If

    Loop

    For i = 1 To n1

    ceros(i) = Bipartp(z(), rr(i, 1), rr(i, 2))

    Next i

    res = "": m = g Mod 2

    For i = n1 To 1 Step -1

    res = res + "-" + Format$(ceros(i), "0.##############") + rc

    Next i

    If m = 1 Then res = res + "0" + rc

    For i = 1 To n1

    res = res + Format$(ceros(i), "0.##############") + rc

    Next i

    CerosPolLeg = res

    End Function

    ' —————————————————————————————————————

    Public Function Bipartp(ByRef p() As Double, ByVal xa As Double, ByVal xb As Double) As Double

    Dim a As Double, b As Double, c As Double, fc As Double

    Dim n1 As Integer, n0 As Integer, n As Integer

    a = xa: b = xb

    Do

    c = (a + b) / 2

    fc = Vp(p(), c)

    If Sgn(Vp(p(), a)) <> Sgn(fc) Then

    b = c

    Else

    a = c

    End If

    If Abs(a – b) < 0.00000000000001 Then Exit Do

    Loop

    If Abs(c) < 0.000000000001 Then c = 0

    Bipartp = c

    End Function

    ' ———————————————————————————

    Public Function Vp(ByRef pz() As Double, ByVal z As Double) As Double

    Dim fz As Double, gz As Integer, j As Integer

    gz = UBound(pz())

    fz = pz(0)

    For j = 1 To gz

    fz = fz * z + pz(j)

    Next j

    Vp = fz

    End Function

    ' ———————————————————————————

    Public Function Rastreo(ByRef py() As Double, ByVal ai As Double, ByVal bi As Double, st As Double)

    Dim i As Double, g As Integer, k As Integer

    Dim c As Double, fa As Double, fb As Double, fc As Double

    Dim u() As Double, ni As Integer, g1 As Integer

    g = UBound(py): k = 1: g1 = Int(g / 2)

    ReDim u(g1, 2)

    For i = ai To bi Step st

    If i <> ai Then

    fa = fb

    Else

    c = i

    fc = Vp(py(), c)

    fa = fc

    End If

    If i + st < bi Then

    c = i + st

    Else

    c = bi

    End If

    fc = Vp(py(), c)

    fb = fc

    If (fa < 0 And fb > 0) Or (fa > 0 And fb < 0) Then

    u(k, 1) = i: u(k, 2) = i + st

    ni = k

    k = k + 1

    End If

    Next i

    Rastreo = u()

    End Function

    En el caso del polinomio edu.redse obtienen los ceros siguientes:

    -0.94910791234275, -0.7415311855994, -0.4058451513774, 0, 0.94910791234275, 0.7415311855994, 0.4058451513774

    Si se quieren obtener los ceros de los polinomios con mayor precisión o se quieren calcular los ceros de un polinomio de grado mayor que 24, hay que utilizar otro código que trabaja con enteros y decimales extra-largos [4], [5] y que se expone a continuación.

    Public Function CalCPLegNG(ByRef g As Integer, pr) As String

    Dim i As Integer, y() As String, z() As String, gg As Integer

    Dim ceros() As String, rr() As String, m As Integer, n1 As Integer

    Dim res As String, rc As String, st As String

    If g = 0 Then

    CalCPLegNG = "¡P0 no tiene ceros!"

    Exit Function

    End If

    If g = 1 Then

    CalCPLegNG = "El único cero de P1 es x = 0"

    Exit Function

    End If

    If g < 32 Then st = "0.013" Else st = "0.0013"

    ReDim z(g), ceros(g)

    rc = Chr$(13) + Chr$(10)

    y() = PolLegNG(g)

    For i = 0 To g

    z(i) = y(i)

    Next i

    Do

    rr() = RastreoNG(z(), 0, 1, st)

    n1 = UBound(rr())

    If rr(n1, 1) <> "" Then

    Exit Do

    Else

    x(1) = st: x(2) = "0.13": st = MultiplicarDec(x(), n)

    End If

    Loop

    For i = 1 To n1

    ceros(i) = BipartpNG(z(), rr(i, 1), rr(i, 2), pr)

    Next i

    res = "Los ceros del polinomio " + "P" + Mid$(Str$(g), 2) + "(x) son: " + rc

    m = g Mod 2

    For i = n1 To 1 Step -1

    res = res + "-" + ceros(i) + rc

    Next i

    If m = 1 Then res = res + "0" + rc

    For i = 1 To n1

    res = res + ceros(i) + rc

    Next i

    CalCPLegNG = res

    End Function

    ' ———————————————————————————

    Public Function BipartpNG(ByRef p() As String, ByVal xa As String, ByVal xb As String, ByVal pr As Integer) As String

    Dim i As Integer, a As String, b As String, c As String, fc As String, x(2) As String

    Dim fa As String, dif As String, n As Integer, prod As String, prec As String

    ' pr es el número de cifras a calcular después del punto decimal.

    n = 7: a = xa: b = xb: prec = "0."

    For i = 1 To pr: prec = prec + "0": Next i

    prec = prec + "1"

    Do

    x(1) = a: x(2) = b: c = SumarDec(x(), n): c = DividirPor2Dec(c, n)

    fc = VpNG(p(), c): fa = VpNG(p(), a)

    x(1) = fa: x(2) = fc: prod = MultiplicarDec(x(), n)

    If Left$(prod, 1) = "-" Then

    b = c

    Else

    a = c

    End If

    x(1) = a: x(2) = b: dif = RestarDec(x(), n)

    If Left$(dif, 1) = "-" Then dif = Mid$(dif, 2)

    x(1) = dif: x(2) = prec: dif = RestarDec(x(), n)

    If Left$(dif, 1) = "-" Then Exit Do

    Loop

    BipartpNG = Left$(c, pr + 2)

    End Function

    ' ———————————————————————————

    Public Function VpNG(ByRef pz() As String, ByVal z As String) As String

    Dim fz As String, gz As Integer, j As Integer, x(2) As String, n As Integer

    n = 7: gz = UBound(pz())

    fz = pz(0)

    For j = 1 To gz

    x(1) = fz: x(2) = z: x(1) = MultiplicarDec(x(), n)

    x(2) = pz(j): fz = SumarDec(x(), n)

    Next j

    VpNG = fz

    End Function

    ' —————————————————————————————————–

    Public Function RastreoNG(ByRef py() As String, ByVal ai As String, ByVal bi As String, ByVal st As String) As Variant

    Dim i As String, g As Integer, k As Integer, x(2) As String

    Dim c As String, fa As String, fb As String, fc As String, r As String

    Dim u() As String, sgfa As String, sgfb As String, dif As String

    Dim g1 As Integer, t As Single, ist As String, n As Integer

    g = UBound(py): g1 = Int(g / 2): k = 1: n = 7

    ReDim u(g1, 2)

    i = ai

    Do

    If i <> ai Then

    fa = fb

    Else

    fa = VpNG(py(), ai)

    End If

    x(1) = i: x(2) = st: ist = SumarDec(x(), n)

    x(1) = ist: x(2) = bi: r = RestarDec(x(), n)

    If Left$(r, 1) = "-" Then

    c = ist

    Else

    c = bi

    End If

    fc = VpNG(py(), c)

    fb = fc

    x(1) = fa: x(2) = fb: r = MultiplicarDec(x(), n)

    If Left$(r, 1) = "-" Then

    u(k, 1) = i: u(k, 2) = ist

    k = k + 1

    End If

    x(1) = bi: x(2) = ist

    dif = RestarDec(x(), n)

    If Left$(dif, 1) = "-" Then Exit Do

    i = ist

    Loop

    RastreoNG = u()

    End Function

    Si en el caso del polinomio edu.redlos ceros se quieren calcular con 24 decimales después del punto decimal edu.redel resultado de los cálculos (sin redondeo) será el siguiente:

    edu.red

    Los ceros de edu.redcalculados con 12 cifras después del punto decimal son:

    -0.998540200636, -0.992316392138, -0.981151833077, -0.965099650422,

    -0.944239509118, -0.918675259984, -0.888534238285, -0.853966595004,

    -0.815144539645, -0.772261479248, -0.725531053660, -0.675186070666,

    -0.621477345903, -0.564672453185, -0.505054391388, -0.442920174525,

    -0.378579352014, -0.312352466502, -0.244569456928, -0.175568014775,

    -0.105691901708, -0.035289236964, 0.035289236964, 0.105691901708,

    0.175568014775, 0.244569456928, 0.312352466502, 0.378579352014,

    0.442920174525, 0.505054391388, 0.564672453185, 0.621477345903,

    0.675186070666, 0.725531053660, 0.772261479248, 0.815144539645,

    0.853966595004, 0.888534238285, 0.918675259984, 0.944239509118,

    0.965099650422, 0.981151833077, 0.992316392138, 0.998540200636

    Teorema 8: Los polinomiosedu.redde Legendre son soluciones de la ecuación diferencial siguiente:

    edu.red (27)

    Si edu.red, por derivación resulta que

    edu.red (28)

    Derivando edu.reda ambas partes la última igualdad de (28) según la fórmula (4) de Leibniz, se obtiene que

    edu.red

    edu.red

    edu.red

    edu.red (29)

    Partes: 1, 2
    Página siguiente