Табулирование функций

Содержание |  Назад  |  Вперед

Табулирование функции - это вычисление значенй функции при изменении аргумента от некоторого начального значения до некоторого конечного значения с определенным шагом. Именно так составляются таблицы значений функций, отсюда и название - табулирование. Необходимость в табулировании возникает при решении достаточно широкого круга задач. Например, при численном решении нелинейных уравнений  f(x) = 0, путем табулирования можно отделить (локализовать) корни уравнения, т.е. найти такие отрезки, на концах которых, функция имеет разные знаки. С помощью табулирования можно, хотя и очень грубо, найти минимум или максимум функции. Иногда случается так, что функция не имеет аналитического представления, а ее значения получаются в результате вычислений, что часто бывает при компьютерном моделировании различных процессов. Если такая функция будет использоваться в последующих расчетах (например, она должна быть проинтегрирована или продифференцирована и т.п.), то часто поступают следующим образом: вычисляют значения функции в нужном интервале изменения аргумента, т.е. составляют таблицу (табулируют), а затем по этой таблице строят каким-либо образом другую функцию, заданную аналитическим выражением (формулой). Необходимость в табулировании возникает также при построении графиков функции на экране компьютера. И т.д. и т.п.

Итак, пусть необходимо протабулировать функцию y(x)=exp(-x2) на интервале [-2, 2] с шагом 0.1. Поскольку программа должна многократно вычислять значения функции (одной и той же), то разумно составить циклический алгоритм. Для организации цикла можно использовать любой из циклических операторов (WHILE, REPEAT..UNTIL или FOR). В данной постановке задачи наиболее удобны два первых оператора, поскольку для оператора FOR необходимо еще предварительно вычислить количество шагов.

Ниже приведены две программы, которые используют операторы WHILE и REPEAT..UNTIL для органзцации цикла, а также блок-схемы соответствующих алгоритмов.

В программах используются следующие переменные: xmin и xmax - для указания диапазона (интервала) табулирования; dx - для указания шага табулирования; x и y - для арумента и значения функции, соответственно.

PROGRAM TablFunc_1;
VAR
  x, y,
  xmin, xmax, dx : Real;
BEGIN
  Writeln('Табулирование функции.');
  xmin := -2;
  xmax := 2;
  dx := 0.1;
  x := xmin;
  WHILE x<=xmax DO begin
    y := exp(-sqr(x));
    Writeln(x:6:3, y:6:3);
    x := x+dx;
  end {while};
  Readln
END.

PROGRAM TablFunc_2;
VAR
  x, y,
  xmin, xmax, dx : Real;
BEGIN
  Writeln('Табулирование функции.');
  xmin := -2;
  xmax := 2;
  dx := 0.1;
  x := xmin;
  REPEAT
    y := exp(-sqr(x));
    Writeln(x:6:3, y:6:3);
    x := x+dx;
  UNTIL (x>xmax);
  Readln
END.

Любую из этих программ можно легко модифицировать с тем, чтобы значения переменных xmin, xmax и dx, определяющих, соответственно, интервал изменения аргумента и шаг, задавались с клавиатуры.

Изменим немного постановку задачи: необходимо вычислить значения функции y(x)=exp(-x2) на интервале [-2, 2] в 20-ти равноотстоящих точках (узлах). Здесь явно не задан шаг, а указано количество значений аргумента N=20 и, соответственно, количество значений функции. Шаг табулирование определяется простым соотношением

dx = (xmax-xmin)/(N-1).

Значение аргумента на любом i-том шаге можно определить как

xi = xmin + dx * (i-1).

При решении этой задачи оператор FOR оказывается наиболее подходящим.

PROGRAM TablFunc_3;
VAR
  x, y,
  xmin, xmax, dx : Real;
            i, N : Integer;
BEGIN
  Writeln('Табулирование функции.');
  xmin := -2;
  xmax := 2;
  N := 20;
  dx := (xmax-xmin)/(N-1);
  FOR i:=1 TO N DO begin
    x := xmin + dx*(i-1);
    y := exp(-sqr(x));
    Writeln(x:6:3, y:6:3);
  end {for};
  Readln;
END.

Во всех рассмотренных выше примерах, результаты табулирования просто выводятся на экран и не доступны в дальнейшем. Для хранения результатов табулирования можно использовать два одномерных массива (вектора) длинной N. Если результаты необходимо сохранить и по окончании работы программы, то их можно записать в текстовый файл.

Подробнее о массивах см. здесь.

Ниже приведен пример, в котором результаты табулирования записываются в массивы и одновременно сохраняются в текстовом файле с именем tabl.dat в текущем каталоге. (См. также пример здесь).

PROGRAM TablFunc_4;
CONST
  N = 20; { табулируем функцию в 20-ти точках }
VAR
  X, Y : array[1..N] of Real;
  xmin, xmax, dx : Real;
  i : Integer;
  f : Text; { файловая переменная }
BEGIN
  Assign(f,'tabl.dat'); { связываем f с физическим файлом }
  Rewrite(f); { открываем новый файл для записи }
  Writeln('Табулирование функции.');
  xmin := -2;
  xmax := 2;
  dx := (xmax-xmin)/(N-1);
  FOR i:=1 TO N DO begin
   X[i] := xmin + dx*(i-1);
   Y[i] := exp(-sqr(X[i]));
   Writeln(X[i]:6:3, Y[i]:6:3);
   Writeln(f, X[i]:6:3, Y[i]:6:3); { выводим данные в файл }
  end {for};
  Close(f); { закрываем файл }
  { Здесь можно использовать массивы
    X и Y для дальнейших вычислений }
  Readln
END.

 

Содержание |  Назад  |  Вперед