Полиномы Лежандра. Численные значения коэффициентов

 UNIT unharzot ;
 INTERFACE
 
Объявляем глобальный тип для числовых значений коэффициентов полиномов Лежандра:

 { P_n(z)=a_0+a_1*z+a_2*z^2+a_3*z^3+...+a_n*z^n }
 Const
   maxp  = 252 ;   { максимальный порядок полиномов Лежандра }
 Type
   TPol  = Array[0..maxp] of Extended ;  { тип переменных }
 (*
   в зависимости от чётности или нечётности порядка полинома n
   коэффициенты a_i равны нулю
   при чётных или нечётных значениях интекса i
   элемент массива [0] для значения коэффициента при z в степени 0
   элемент массива [1] для значения коэффициента при z в степени 1
   элемент массива [2] для значения коэффициента при z в степени 2
   ...
   элемент массива [n] для значения коэффициента при z в степени n
 *)
  

Объявляем глобальные переменные для рекуррентного вычисления значений коэффициентов полиномов Лежандра (от нулевого порядка до максимального):

 Var
   pnul  : TPol ; { значения коэффициентов предпредыдущего полинома P_(n-2)}
   pone  : TPol ; { значения коэффициентов предыдущего полинома P_n-1) }
   ptwo  : TPol ; { значения коэффициентов текущего полинома P_n }
   pdif  : TPol ; { значения коэффициентов после дифференцирования P'_n }
  

Объявляем прототип глобальной процедуры вычисления коэффициентов полиномов Лежандра и коэффициентов полиномов, образованных последовательным дифференцированием:

 { to obtain the formula for each Legandre polinom
   or the numerical values of the coefficients an
   in the form
   Pn(z)=a0+a1*z+a2*z**2+a3*z**3+a4*z**4+...+an*z**n
   by the use recurent formula
   n*Pn(z)=(2*n-1)*z*P(n-1)(z)-(n-1)*P(n-2)(z),  P0(z)=1, P1(z)=z }

 Procedure RecurentFormula ;

 implementation
  

Составляем процедуру вычисления начальных значений коэффициентов полиномов:

 Procedure NulloPol ; { for the initial value }
 Var
   nz  : Byte ;
 Begin
   For nz:=0 To maxp Do
     Begin
       pnul[nz]:=0.0; { начальные значения коэффициентов равны нулю }
       pone[nz]:=0.0;
       ptwo[nz]:=0.0;
       pdif[nz]:=0.0;
     End;
   pnul[0]:=1.0; { P0(z)=1 элемент массива [0] есть z в степени 0 }
   pone[1]:=1.0; { P1(z)=z элемент массива [1] есть z в степени 1 }
 End;
 

Составляем процедуру для передачи предыдущих значений коэффициентов полинома в предпредыдущие, а текущих коэффициентов полинома в предыдущие:

 Procedure RocirPol ( np  : Byte ) ; { to shift polinoms }
 Var
   nz  : Byte ;
 Begin
   For nz:=0 To np Do
     Begin
       pnul[nz]:=pone[nz]; { коэффициенты n-1 -> n-2 }
       pone[nz]:=ptwo[nz]; { коэффициенты  n -> n-1 }
       ptwo[nz]:=0.0;      { начальные значения для n }
       pdif[nz]:=0.0;
     End;
 End;
 

Составляем процедуру заполнения элементов массива, соответствующего значениям коэффициентов текущего полинома:

 (*
   порядок текущего полинома np
   но элементы массивов,
   соответствующие полиному порядка (np-1)
   и полиному порядка (np-2) должны быть вычислены
 *)
 Procedure RecurPol ( np  : Byte ) ; { simple recurent }
 Var
   nz  : Byte ;
   rn  : Extended ;
   ra  : Extended ;
   rb  : Extended ;
 Begin
   { n*Pn(z)=(2*n-1)*z*P(n-1)(z)-(n-1)*P(n-2)(z) }
   rn:=1.0/np;                             { 1/n }
   ra:=(np-1)*rn;                          { (n-1)/n }
   rb:=(2*np-1)*rn;                        { (2n-1)/n }
   For nz:=0 To np-2 Do                    { с фактором -(n-1)/n }
     ptwo[nz]:=-ra*pnul[nz];               { плюс предпредыдущие }
   For nz:=1 To np Do                      { с фактором +(2n-1)/n }
     ptwo[nz]:=ptwo[nz]+rb*pone[nz-1];     { плюс предыдущие }
   For nz:=1 To np Do                      { начальные значения }
     pdif[nz]:=ptwo[nz];                   { для дифференцирования }
 End;
 

Составляем процедуру для выдачи на экран ненулевых численных значений коэффициентов полинома Лежандра порядка n или коэффициентов полинома, полученного как производная порядка m от полинома Лежандра порядка n:

 Procedure PolWrite ( n  : Byte ;    { порядок полинома }
                      m  : byte ;    { порядок производной}
                      p  : tpol ) ;  { коэффициенты текущего полинома }
 Var
   i  : byte ;
   k  : Byte ;
 Begin
   WriteLn(n:5,m:5,'  P_',n,'^',m,'(z)');
   i:=0; { initial number of terms }
   For k:=0 To maxp Do
     If  Abs(p[k]) > 1.0e-6
       Then
         i:=i+1; { the next term }
   WriteLn(i:10,'  terms ');
   i:=0;
   For k:=0 To maxp Do
     If  Abs(p[k]) > 1.0e-6  { function unharstr }
       Then
         begin
           i:=i+1;
           WriteLn(i:10,' ':10,FloatWithPower(p[k],30),'  * z^',k);
         end;
 End;
 

Составляем процедуру последовательного дифференцирования полинома Лежандра порядка n:

 procedure PolDifun ( n  : byte ) ; { to differentiate }
 var
   i  : byte ;
   m  : byte ; { count }
 begin
   for m:=1 to n do { polinom by polinom to differentiate }
     begin                  { d(a_i*z^i)/dz=i*a_i*z^(i-1) }
       for i:=0 to maxp do           { the next polinom }
         pdif[i]:=(i+1.0)*pdif[i+1]; { with derivations }
       PolWrite(n,m,pdif);
     end;
 end;
 

Составляем процедуру последовательного вычисления коэффициентов полинома Лежандра от нулевого порядка до максимального и вычисления коэффициентов полиномов, образованных путём дифференцирования полиномов Лежандра:

 { to obtain the formula for each Legandre polinom
   or the numerical values of the coefficients an
   in the form
   Pn(z)=a0+a1*z+a2*z**2+a3*z**3+a4*z**4+...+an*z**n
   by the use recurent formula
   n*Pn(z)=(2*n-1)*z*P(n-1)(z)-(n-1)*P(n-2)(z),  P0(z)=1, P1(z)=z }

 Procedure RecurentFormula ; { основная процедура }
 Var
  np  : Byte ;
 Begin
   NulloPol ;
   For np:=2 To maxp Do
     Begin
       RecurPol(np);
       if  np = maxp
         then
           begin
             PolWrite(np,0,ptwo); { polinom }
             PolDifun(np); { with array pdif[..] }
           end;
       RocirPol(np);
     End;
 End;

 End.
  

Эта процедура объявлена как глобальная и может быть вызвана из основной программы.
В текстовом наборе данных содержится пример вычислений.
В текстовом наборе данных содержится пример вычислений коэффициентов полинома Лежандра порядка 30 вместе с коэффициентами полиномов, образованных последовательным дифференцированием.
В текстовом наборе данных содержится пример вычислений коэффициентов полинома Лежандра порядка 36 вместе с коэффициентами полиномов, образованных последовательным дифференцированием.
Можно вернуться к начальному тексту.


Здесь можно вернуться на страницу Тексты и алгоритмы

Hosted by uCoz