Полиномы Лежандра. Численные значения коэффициентов
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
вместе с коэффициентами полиномов,
образованных последовательным дифференцированием.
Можно вернуться к начальному тексту.
Здесь можно вернуться на страницу Тексты и алгоритмы