Табулирование функций |
Содержание | Назад | Вперед |
Табулирование функции - это вычисление значенй функции при изменении аргумента от некоторого начального значения до некоторого конечного значения с определенным шагом. Именно так составляются таблицы значений функций, отсюда и название - табулирование. Необходимость в табулировании возникает при решении достаточно широкого круга задач. Например, при численном решении нелинейных уравнений 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.
Содержание | Назад | Вперед |