- •4. Организация программ со структурой вложенных циклов
- •4. Организация программ со структурой вложенных циклов
- •; // Конец второго внутреннего цикла
- •//Вычисление и печать таблицы умножения чисел от 1 до 100
- •Write(I*j); // умножение выполняется 10000 раз
- •Begin begin
- •WriteLn(s:7:2); WriteLn(s:7:2);
- •Вычисление определенного интеграла с заданной точностью
- •Пример программы вычисления определенного интеграла с точностью методом трапеций
- •Задания 4.1 на вычисление интеграла с точностью.
- •Вычисление наибольшего (наименьшего) значения функции с заданной точностью на заданном интервале
- •// Числения максимума
- •// Тервала
- •Задания 4.2 на нахождение экстремума функции с заданной точностью.
- •Обработка матриц
- •Менее предпочтительными, но допустимыми будут объявления типа
- •X:array[1.. MMax, 1..NMax] of Real;
- •X:array[1..12, 1..14] of Real;
- •Пример 1 выполнения задания на матрицы
- •Пример 2 выполнения задания на матрицы
- •Пример 3 выполнения задания на матрицы
- •Пример 4 выполнения задания на матрицы
- •Задания 4.3 на обработку матриц (вложенные циклы)
Пример программы вычисления определенного интеграла с точностью методом трапеций
program integraltoch;
{вычисление определенного интеграла с заданной точностью методом трапеций}
{ подынтегральная функция – X*Exp(X); первообразная функция (x-1)*Exp(X)}
{$APPTYPE CONSOLE}
uses
SysUtils,Math;
var
A,B,Eps,I1,I2,Itoch,X,Dx,S1:Real;
I,N,M,K:Integer;
begin
WriteLn('Введите пределы интегрирования и точность');
ReadLn(A,B,Eps);
//вычисление начального количества разбиений
N:=Trunc((B-A)/Sqrt(Eps))+1;
//начальное значение интеграла, взятое при n=1
I2:=(A*Exp(A)+B*Exp(B))*(B-A)/2.0;
//полусумма значений функции на нижнем и
// верхнем пределах интегрирования
S1:=(A*Exp(A) + B*Exp(B))/2.0;
//начало внешнего цикла вычисления интеграла
repeat
//предыдущему значению интеграла присваивается текущее
I1:=I2;
//начальному значению суммы присваивается полусумма
//значений функции на концах интервала интегрирования
I2:=S1;
//шаг изменения переменной интегрирования
Dx:=(B-A)/N;
//внутренний цикл для вычисления суммы значений
//функции при фиксированном количестве шагов
for I:=1 to N-1 do
begin
X:=A+I*Dx; // текущее значение аргумента
//вычисление суммы значений функции в узлах интегрирования
I2:=I2+X*Exp(X);
end;
I2:=I2*Dx; //текущее значение интеграла
N:=N*2; //удвоение количества разбиений
until Abs(I2-I1)/3<Eps; //анализ точности вычисление
//вычисление количества позиций при выводе
//числа с заданной точностью
M:=Trunc(-Log10(Eps))+2;
K:=Trunc(Log10(I2))+M+3;
WriteLn('Значение интеграла =',I2:K:M
,' при количестве разбиений, равном ‘, N div 2);
Itoch:=(B-1)*Exp(B)-(A-1)*Exp(A);//точное значение интеграла
WriteLn('Точное значение интеграла равно ',Itoch:K:M);
ReadLn;
end.
Следует заметить, что метод трапеций удобен для вычисления интеграла по правилу Рунге, так как при увеличении количества разбиений в два раза каждый второй узел представляет собой ранее рассматривавшийся узел, поэтому вновь значения функции в этих точках вычислять не следует. Для этого следует сумму значений функции в этих узлах сохранять в переменной s2 .
Фрагмент модифицированной программы приведен ниже. В отличие от первого варианта программы до вложенного цикла необходимо написать цикл вычисления сумм значений функции при начальном разбиении интервала интегрирования для всех узлов, кроме первого и последнего.
ReadLn(A,B,Eps);
N:=Trunc((B-A)/Sqrt(Eps))+1;
S1:=(A*Exp(A) + B*Exp(B))/2.0;
S:=0;
Dx:=(B-A)/N;
//цикл вычисления суммы значений функции в узлах интегриро-
//вания при начальном разбиении интервала интегрирования
for I:=1 to N-1 do
begin
X:=A+I*Dx;
S:=S+ X*Exp(X);
end;
I2:=Dx*(S+S1);
S2:=S;
repeat
I1:=I2;
N:=N*2;
Dx:=(B-A)/N;
X1:=A+Dx; //координата первого нового узла интегрирования
S:=0;
//цикл вычисления суммы значений функции в новых узлах
// интегрирования
for I:=1 to N div 2 do
begin
X:=X1+2*(I-1)*Dx;
S:=S+ X*Exp(X);
end;
//сумма значений функции в узлах интегрирования при новом
//числе разбиений
S2:=S+S2;
I2:=(S1+S2)*Dx;
until Abs(I2-I1)/3<Eps;
Таким же образом можно сократить количество выполняемых операций при вычислении интеграла по методу левых или правых прямоугольников. Однако на практике при использовании метода прямоугольников значение функции вычисляют не на конце интервала (левом или правом), а в его середине. В этом случае при удвоении числа разбиений ранее вычисленные значения функции (и их сумму) использовать не удается. Для использования результатов ранее выполнявшихся вычислений при применении метода прямоугольников следует количество разбиений увеличивать в три раза и вычислять значения функции в точках с абсциссами Xi = Xнач +hi/6+h(i-1), i=1,n; Xj = Xнач +5hj/6+h(j-1), j=1,n. В приведенных выражениях Xнач – нижний предел интегрирования, h – шаг интегрирования и n – количество разбиений на предыдущей итерации.
При вычислении интеграла по методу Симпсона можно непосредственно использовать суммы значений функции, вычислявшиеся на предыдущей итерации. При этом надо иметь в виду, что узлы с нечетными номерами получают на очередной итерации четные индексы и сумма значений функции для этих узлов должна браться с коэффициентом 2 (на предыдущей итерации с коэффициентом 4). Узлы с четными номерами и при новой итерации останутся четными, поэтому сумма значений в этих узлах берется с тем же коэффициентом 2.