Vladimir_S |
02.05.2011 09:22 |
Так, ну прежде всего, можете сказать, что тот, кто составлял это задание - полный профан в математике, придурок и неуч, поскольку функция ArTh (ареатангенс) определена ТОЛЬКО в диапазоне |x|<1, а приведенный ряд - это разложение функции ArCth (ареакотангенс), действительно определенной только при |x|>1. В программе предусмотрена проверка правильности ввода исходных данных, а также в четвертой колонке для сравнения выводится точное значение функции ареакотангенс. Точность задана в виде константы.
Код:
CONST
Eps=0.0001;
VAR
SUM,X,Xbeg,Xfin,dX:REAL;
N,NX:WORD;
i:Integer;
FUNCTION ArCth(Xa:Extended):Extended;
BEGIN
ArCth:=(1/2)*Ln((Xa+1)/(Xa-1));
END;
PROCEDURE SUMS(Xs:REAL; Var S:REAL; Var Ns:WORD);
VAR
a:REAL;
Begin
a:=1/Xs;
S:=a;
Ns:=1;
Repeat
a:=a/sqr(Xs)*Ns/(Ns+2);
S:=S+a;
Inc(Ns,2);
Until Abs(a)<Eps;
End;
Function B:boolean;
begin
B:=((Xbeg>1) and (Xfin>Xbeg) and (dX>0)) or
((Xbeg<-1) and (Xfin<-1) and (Xfin>Xbeg) and (dX>0)) or
((Xbeg<-1) and (Xfin<Xbeg) and (dX<0));
end;
BEGIN
WriteLn('If X range is POSITIVE, then Xbeg must be >1,');
WriteLn('Xfin must be >Xbeg and dX>0');
WriteLn('If X range is NEGATIVE, then Xbeg and Xfin must be <-1,');
WriteLn('in case of dX>0 Abs(Xfin) must be <Abs(Xbeg),');
WriteLn('whereas for dX<0 Abs(Xfin) must be >Abs(Xbeg)');
WriteLn;
Repeat
Write('Xbeg= ');
ReadLn(Xbeg);
Write('Xfin= ');
ReadLn(Xfin);
Write('dX= ');
ReadLn(dX);
If B=false then
WriteLn('Incorrect values! Repeat the input.');
Until B;
NX:=Round((Xfin-Xbeg)/dX);
WriteLn(' Results of calculation:');
WriteLn(' X SUM N ArCth(X)');
WriteLn;
For i:=0 to NX do
begin
X:=Xbeg+dX*i;
SUMS(X,SUM,N);
WriteLn(X:8:5,' ',SUM:9:6,' ',N:3,' ',ArCth(X):9:6);
end;
ReadLn;
END.
|