Wartosc pierwiastka: 2.645751311E+00 Blad pierwiastka: 3.64E-12 Liczba ogniw ulamka: 20
Nowe obliczenia: (t/n)?
1.6. Rozwijanie funkcji w ułamki łańcuchowe
Ułamki łańcuchowe stanowią wygodny aparat do przedstawiania i obliczania wartości funkcji. Aby rozwinąć daną funkcję w ułamek łańcuchowy musimy najpierw przed-stawić ją w postaci funkcji wymiernej
(1.20)
Rozpatrzymy obliczanie wartości wielomianu
(1.21)
przyjmując funkcje i również w postaci wielomianów
(1.22)
Po przyrównaniu prawych stron (1.21) i (1.22) otrzymujemy zależność
z której wynika układ równań dla określenia nieznanych współczynników
(1.23)
Błąd aproksymacji wielomianu (1.21) funkcją wymierną (1.22) można ocenić za pomocą współczynnika wielomianu
(1.24)
Rozważmy w charakterze przykładu rozwinięcie funkcji w szereg Maclaurina
(1.25)
zbieżny dla . Dla tej funkcji, po rozwiązaniu układu równań (1.23), otrzymujemy:
i następnie mamy
(1.26)
przy czym błąd aproksymacji (1.24) szeregu Maclaurina zawierającego wyrazy do włącznie funkcją wymierną (1.26) wynosi
Rozwinięcie funkcji wymiernej
(1.27)
w ułamek łańcuchowy jest realizowane poprzez wykonywanie kolejnych przekształceń elementarnych
,
gdzie
oraz
W taki sam sposób rozkładamy funkcję
gdzie
przy czym
itd. Współczynniki określające rozwinięcie funkcji (1.27) w ułamek łańcuchowy
najwygodniej jest obliczać z ogólnego wzoru
dla Wykorzystując opisany algorytm łatwo uzyskujemy rozwinięcie rozważanej fun-kcji (1.26) w ułamek łańcuchowy
(1.28)
Pełne rozwinięcie funkcji w ułamek łańcuchowy jest następujące [2]:
(1.29)
Rozwinięcie to jest osobliwe dla ponieważ jest
liczbę należy więc obliczać jako kwadrat liczby e.
{Program 1.3} uses Crt; var i,j,k,n: Integer; bl,c,dx,eps,sum,sump,x,xmax: Real; a,b: array [0..20] of Real; nap,zbior: String; war: Boolean; plik: Text; zn: Char; label kon; begin zbior:='Pr_1_3.wyn'; Assign(plik,zbior); Rewrite(plik); ClrScr; Writeln('Wybor alternatywy obliczen:'); Writeln(' - 1: funkcja Exp(x)'); Writeln(' - 2: funkcja Tan(x)'); zn:=ReadKey; war:=(zn='1') or (zn='2'); if not war then goto kon; if zn='1' then nap:='Exp(x)' else nap:='Tan(th)'; Writeln(plik,'PROGRAM 1.3'); Writeln(plik,'Obliczanie wartosci funkcji ',nap,'.'); Writeln(plik,'Metoda rozwijania w ulamki lancuchowe.'); Writeln('Dane do obliczen:'); Write(' - n = '); Readln(n); Write(plik,'n = ',n:3); if zn='1' then Write(' - xmax = ') else Write(' - thmax = '); Readln(xmax); if zn='1' then Write(plik,', xmax = ') else Write(plik,', thmax = '); Write(plik,xmax:13); Write(' - eps = '); Readln(eps); Writeln(plik,', eps = ',eps:9); if zn='1' then Writeln(plik,' i x ', nap,' blad k') else Writeln(plik,' i th ', nap,' blad k'); if zn='2' then xmax:=xmax*Pi/180; dx:=xmax/n; a[0]:=0; b[0]:=0; for i:=1 to n do begin x:=i*dx; if zn='1' then begin a[1]:=1; a[2]:=2+x; b[1]:=1; b[2]:=-2*x; for j:=3 to 20 do begin a[j]:=4*(j-2)+2; b[j]:=x*x; end; end; if zn='2' then begin for j:=1 to 20 do begin a[j]:=2*(j-1)+1; b[j]:=-x*x; end; b[1]:=x; end; k:=1; sump:=0; repeat c:=b[k]/a[k]; for j:=1 to k do begin sum:=a[k-j]+c; c:=b[k-j]/sum; end; bl:=Abs(sum-sump); k:=k+1; sump:=sum; until bl if zn='1' then bl:=Abs(sum-Exp(x)) else bl:=Abs(sum-Sin(x)/Cos(x)); if zn='2' then x:=x*180/Pi; Writeln(plik,i:3,x:12:6,' ',sum:13, ' ',bl:9,' ',k:2); end; Close(plik); kon: end.
W programie 1.3 wyznaczane są z zadaną dokładnością wartości funkcji oraz z rozwinięcia (1.29) oraz rozwinięcia w ułamek łańcuchowy [2]
w przedziałach i w n równoodległych punktach. Uzyskane wyniki porównano z rezultatami wywołań odpowiednich arytmetycznych funkcji standardowych. Drukowana jest także liczba ogniw k ułamka łańcuchowego, niezbędna do obliczenia wartości funkcji z zadaną dokładnością Wykonane przez program 1.3 obliczenia wartości funkcji i zawierają dwa kolejne tabulogramy wyników.