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