Вычисление определённого интеграла с точностью 10 в степени -6, страница 3

Array arrayIntervals;                   // Массив отрезков

Array arrayResults;                     // Массив интегралов

// Ньютон-Котес -----------------------------------------------------------------------------------------int m = 0;                              // количество отрезков

do {

m++;                                // увеличиваем кол-во отрезков

h = (RIGHT - LEFT) / m;             // длина отрезка

result = intKotes(m, h);            // ~ интеграл

arrayIntervals.add(h);                       // добавляем Hm-тое в массив

arrayResults.add(result);

} while (abs(richardson(arrayResults, arrayIntervals)) > PRECISION) ;

cout<<"Kotes: "<<"m = 1;   R = J - S = " << setprecision(15) << J - intKotes(1, (RIGHT-LEFT)) << endl;

cout<<"       "<<"m = " << m << "; R = J - S = " << setprecision(15) << J - result << endl;

cout<<"       "<<"    " << m << "; S = " << setprecision(15) << result << endl << endl;

// Гаусс ------------------------------------------------------------------------------------------------m = 0; arrayIntervals.free(); arrayResults.free();

do {

m++;                                // увеличиваем кол-во отрезков

h = (RIGHT - LEFT) / m;             // длина отрезка

result = intGauss(m, h);            // ~ интеграл

arrayIntervals.add(h);              // добавляем Hm-тое в массив

arrayResults.add(result);

} while (abs(richardson(arrayResults, arrayIntervals)) > PRECISION) ;

cout<<"Gauss: "<<"m = 1; R = J - S = " << setprecision(15) << J - intGauss(1, (RIGHT-LEFT)) << endl;

cout<<"       "<<"m = " << m << "; R = J - S = " << setprecision(15) << J - result << endl;

cout<<"       "<<"    " << m << "; S = " << setprecision(15) << result << endl << endl;

system("pause");

return 0;

}

Результаты вычислений

k –число разбиений

J = 27.56649553 - исходный интеграл, подсчитанный в Maple

k

Sk

|J - Sk|

Вариант «Ньютона-Котеса»

k = 1

26.6910388264606

0.8754567035393

k = 102

27.5664966167191

0.0000010867191

Вариант «Гаусса»

k = 1

27.5522952951239

0.0142002348760

k = 8

27.5664959544617

0.0000004244616

Как видим, вариант «Гаусса» намного эффективнее. Нам понадобилось разбить отрезок интегрирования всего на 8 частей, чтобы добиться точности вычисления исходного интеграла до 10-6.

Список литературы:

1.  Олемской И. В. Методические указания по вычислительному практику. (Вычисление определённого интеграла)

2.  Полный справочник по С++ (Г. Шилдт)

3.  Справочник программы Maple