Program RESTRID; CONST np = 1001; TYPE RealArrayNP = ARRAY [1..np] OF real; PROCEDURE tridag(VAR a,b,c,r,u: RealArrayNP; n: integer); { hleda reseni U tridiagonalniho systemu N rovnic, kde vektor A je pod diagonalou (a[1] nema vyznam) B je na diagonale C je nad diagonalou (c[n] nema vyznam) R je prava strana } VAR j: integer; bet: real; gam: ^RealArrayNP; BEGIN new(gam); IF b[1] = 0.0 THEN BEGIN writeln('pause 1 in TRIDAG'); readln END; bet := b[1]; u[1] := r[1]/bet; FOR j := 2 TO n DO BEGIN gam^[j] := c[j-1]/bet; bet := b[j]-a[j]*gam^[j]; IF bet = 0.0 THEN BEGIN writeln('pause 2 in TRIDAG'); readln END; u[j] := (r[j]-a[j]*u[j-1])/bet END; FOR j := n-1 DOWNTO 1 DO u[j] := u[j]-gam^[j+1]*u[j+1]; dispose(gam) END; FUNCTION fprav(x,alf:Real):Real; BEGIN fprav := cos(alf*x); END; VAR a,b,c,r,u: RealArrayNP; n,i,np1: integer; alf,alfnam2,xhod,hna2,kon,maxr,aroz,maxh: Real; BEGIN Writeln(' Zadej pocet intervalu n, konst alf > 0 '); Readln(n,alf); np1 := n + 1; hna2 := 1./n/n; alfnam2 := 1./alf/alf; FOR i:= 2 TO n DO BEGIN a[i] := -1.; b[i] := 2.; c[i] := -1; xhod := (i-1)/n; r[i] := - hna2 * fprav(xhod,alf) END; Writeln(' Predpokladame 0 hodnotu na okrajich '); b[1] := 1; c[1] := 0; r[1] := 0; a[np1] := 0; b[np1] := 1; r[np1] := 0; tridag(a,b,c,r,u,np1); maxr:=0; maxh:=0; FOR i:= 1 TO np1 DO BEGIN xhod := (i-1)/n; kon := alfnam2*(1.+xhod*(fprav(1.0,alf)-1.0)-fprav(xhod,alf)); Writeln(i:5,xhod:9:4,' y(i) ',u[i],' kontr ',kon); aroz:= abs(u[i]-kon); IF aroz > maxr THEN maxr := aroz; IF abs(u[i]) > maxh THEN maxh:= abs(u[i]) END; Writeln; Writeln(' Maximalni rozdil/maximum vysledku = ',maxr/maxh); Readln END.