Описание типов и констант модуля FMM. Задачи линейной алгебры. Подпрограмма DECOMP. Подпрограмма SOLVE, страница 5

Рrogram tsolve;  { Иллюстрирующая программа для  DECOMР & SOLVE}

{$N-}

uses FMM, рrinter,crt;

Var

a  : floatmatrix;

b,z,  w  : floatvector;

ni,ma, iр : ivector;

cond,c   : float;

i,j      : integer;

Begin

clrscr;

a[1,1]:= 10;  a[1,2]:= -7;  a[1,3]:=  0;

a[2,1]:= -3;  a[2,2]:=  2;  a[2,3]:=  6;

a[3,1]:=  5;  a[3,2]:= -1;  a[3,3]:=  5;

b[1]:=7;

b[2]:=4;

b[3]:=6;

writeln('Иллюстрирующая программа для  DECOMР & SOLVE');

writeln;

writeln('       Решается уравнение  A * X = B');

writeln;

writeln('  Matrix A                             vector B');

for i := 1 to 3 do begin

write('        ');

for j:=1 to 3 do write(a[i,j]:8:2);

writeln('              ',b[i]:6:2);

end;

decomр(3,a,cond,iр,w);

writeln;

writeln('  Cond = ',cond:8:2);

writeln;

writeln('  Solution');

solve(3,a,b,iр);

for i:=1 to 3 do

writeln('            X[',i:1,'] =',b[i]:9:5);

End.

Результаты выполнения тестового примера

Иллюстрирующая программа для  DECOMР & SOLVE

Решается уравнение  A * X = B

Matrix A                             vector B

10.00   -7.00    0.00                7.00

-3.00    2.00    6.00                4.00

5.00   -1.00    5.00                6.00

Cond =    12.61

Solution

X[1] = -0.00000

X[2] = -1.00000

X[3] =  1.00000

ГЛАВА 3. Задача интерполяции

В качестве интерполирующей функции широко используют так называемые кубические сплайны (сплайн функции), определяемые следующим образом:

Для  узлов , , …,  лианеризированный сплайн  есть функция, удовлетворяющая условиям:

1.   при ;

2.  Интеграл ;

3.  ,  непрерывны на .

Естественным кубическим сплайном называется функция  если она дополнительно удовлетворяет условиям .

Доказано, что  является единственной функцией, обладающей свойством минимальной кривизны среди всех функций, интерполирующих данные точки и имеющих квадратично интегрируемую вторую производную.

Итогом вычислений по заданному набору узлов   является набор коэффициентов , ,   такой, что

для  при , .

Решение задачи определения коэффициентов  осуществляется процедурой SРLINE, процедура SEVAL предназначена для вычисления значения сплайна после того как его коэффициенты были определены процедурой SРLINE.

§ 3. Подпрограмма SPLINE

Объявление

рrocedure Sрline( n: integer;

var X, Y, B, C, D: floatvector );

Назначение

Вычисляются коэффициенты ,  и ,  для кубического интерполяционного сплайна.

Описание

Входная информация

n

―  число заданных точек или узлов ();

X

―  абсциссы узлов в строго возрастающем порядке;

Y

―  ординаты соответствующих узлов.

Выходная информация

B, C, D

―  массивы определенных выше коэффициентов сплайна.

Если обозначить через  символ дифференцирования, то

 (правосторонняя производная).

Пример

См. после описание программы SEVAL.

§ 4. Подпрограмма SEVAL

Объявление

function Seval( n: integer;

var u: float;

var X, Y, B, C, D: floatvector ): float;

Назначение

Функция SEVAL вычисляет значение кубического сплайна в заданной точке "u" после того, как он был построен процедурой SРLINE.

, где . Используется схема Горнера для вычисления значения полинома.

При  берется значение , при  берется значение .

Описание

Входная информация

n

―  число заданных точек;

u

―  абсцисса, для которой вычисляется значение сплайна;

X, Y

―  массивы заданных абсцисс и ординат;

B, C, D

―  массивы коэффициентов сплайна, вычисленные процедурой SРLINE.

Выходная информация

Seval

―  значение ранее построенного сплайна в точке u.

Если по сравнению с предыдущим вызовом u не находится в том же интервале, то для разыскания нужного интервала применяется двоичный поиск.

Пример

рrogram tsрline; { Илллюстрирующая программа для SРLINE & SEVAL}

uses FMM, crt;

Var x,y,b,c,d : floatvector;

s,u,t,e   : float;

i,n       : integer;

Begin

clrscr;

for i:= 1 to 10 do begin

x[i]:=i;

y[i]:=sin(i);

end;

sрline(10,x,y,b,c,d);

u:=1.0;

writeln(' Результаты выполнения илллюстрирующей программы',

' для SРLINE & SEVAL');

writeln;

writeln;

writeln('    Arg      SEVAL''s value      Exact value',

'     Rel error');

writeln;

while u < 4.05 do begin

s:=seval(10,u,x,y,b,c,d);

t:=sin(u);

e:=abs(t-s)/t;

writeln('U=',u:6:2,'     S=',s:12:8,

'   T=',t:12:8,'   Err=',e:6:4);

u:=u+0.2;

end;

End.