Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mlr_progr_1sem.doc
Скачиваний:
7
Добавлен:
03.11.2018
Размер:
1.72 Mб
Скачать

Решение типовых задач

Задача 1. Дана аналитическая функция . Найти значение определенного интеграла на интервале [a,b] с заданной точностью .

Решение.

Будем решать задачу методом правых прямоугольников.

Листинг 31

/*Определенный интеграл вычесленный с заданной точностью*/

#include <fstream.h>

#include <math.h>

void main( void )

{

// Границы интервала

double dA, dB;

cout << "Input interval [a,b]\n";

// Проверка правильности ввода интервала.

// В случае ошибки ввод повторяется

bool bKey = false;

while ( !bKey )

{

cin >> dA >> dB;

if ( dA < dB )

{

bKey = true;

}

else

{

cout << "Wrong interval [a,b]\n";

}

}

cout << "Input threshold\n";

double dThreshold;

// Ввод заданной точности

cin >> dThreshold;

// Количество частичных интервалов

int nCount = 10;

// Расчет шага аргумента

double dDeltaX = (dB - dA) / nCount;

// Прерыдущее и следующее приближение значения интеграла

double dResultPrev = 0, dResultNext;

// Расчет первого приближения интеграла

for ( int i = 0; i < nCount; i++ )

{

dResultPrev = dResultPrev + 2 * ( dA + dDeltaX * i ) * dDeltaX;

}

// Увеличения числа частичных интервалов

nCount = nCount * 2;

// Перерасчет шага аргумента

dDeltaX = (dB - dA) / nCount;

// Изначально принимаем погрешность вычисления первого приближения

// значения интеграла заведомо большей заданной

double dError = dThreshold + 1;

// Повторяем итерации до тех пор пока не достигнута заданная точность

while ( dError > dThreshold )

{

// Вычисляем ичередное приближение

dResultNext = 0;

for ( i = 0; i < nCount; i++ )

{

dResultNext = dResultNext + 2 * ( dA + dDeltaX * i ) * dDeltaX;

}

// Определяем погрешность вычисления

dError = fabs( dResultNext - dResultPrev );

dResultPrev = dResultNext;

// Выводим промежуточный результат на экран

cout <<"Number of interval: "<<nCount<<"\t Error: "<<dError<<"\n";

// Увеличиваем число частичных интервалов

// и перасчитывем шаг аргумента

nCount = nCount * 2;

dDeltaX = (dB - dA) / nCount;

}

// Выводим на экран конечный результат

cout << "Result: " << dResultPrev << "\n";

}

Тестовый пример

На интервале [0, 2] значение интеграла от функции равно:

Проводим тестирование программы.

Вводим интервал интегрирования [0, 2], точность расчета — 0.1.

Протокол работы программы:

Input interval [a,b]

0

2

Input threshold

0.1

Number of interval: 20 Error: 0.54

Number of interval: 40 Error: 0.285

Number of interval: 80 Error: 0.14625

Number of interval: 160 Error: 0.0740625

Result: 3.92531

Повторяем расчет с повышенной точностью 0.01.

Протокол работы программы:

Input interval [a,b]

0

2

Input threshold

0.01

Number of interval: 20 Error: 0.54

Number of interval: 40 Error: 0.285

Number of interval: 80 Error: 0.14625

Number of interval: 160 Error: 0.0740625

Number of interval: 320 Error: 0.0372656

Number of interval: 640 Error: 0.0186914

Number of interval: 1280 Error: 0.00936035

Result: 3.99063

Задание на лабораторную работу №8

Задача 1. Дана аналитическая функция . Вид функции выбрать в соответствии с таблицей 8.1. Найти значение определенного интеграла на интервале [a,b] с заданной точностью .

Оформить протокол лабораторной работы.

Примечание! Алгоритмы решения задач должны содержать не только расчетную часть, но и блоки формирования входных и выходных данных, а также блоки проверки правильности вводимых данных.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]