Вычислительный эксперимент
Зарегистрируйся в два клика и получи неограниченный доступ к материалам,а также промокод на новый заказ в Автор24. Это бесплатно.
Вычислим интеграл abf(x)dx с точностью ε=0.001 изученными методами.
Пусть
fx=xlnx, a=1;b=4.
Далее приводим текст программы с пояснениями:
#include iostream#include math.h#include conio.h#include localeusing namespace std;
double f(double x)
{
return sqrt(x)*log(x);
}
Пояснения: подключаем стандартную библиотеку ввода-вывода iostream, библиотеку используемых математических функций math.h (квадратный корень sqrt(), модуль числа fabs()), conio.h подключаем для функции _getch в конце, которая считывает один символ из консоли без вывода символа, библиотеку locale для корректного отображения русских букв.
Записываем подынтегральную функцию fx=xlnx в виде подпрограммы. Здесь и далее для чисел с плавающей запятой будем использовать тип double.
double rectangle(double a, double b, int n)
{
double h = (b-a)/n;
double x0;
double sum = 0;
for(int i=0; i=n-1; i++)
{
x0=a+i*h+h/2;
sum += f(x0);
}
sum *= h;
return sum;
}
Пояснения: записываем функцию, вычисляющую интеграл методом средних прямоугольников при n числе разбиений отрезка интегрирования [a,b]. h – шаг интегрирования. В переменной sum накапливаем значение интегральной суммы, т.е. суммы значений в серединах отрезков разбиения. Для вычисления суммы используем цикл for. В завышении умножаем сумму на шаг интегрирования h – получаем значение интеграла. Алгоритм программы соответствует схеме на рисунке 2.1.
void rectangleE(double a, double b, double eps)
{
double s1,s2;
s1 = (b-a)*f((a+b)/2);
int n=2;
s2 = rectangle(a,b,n);
while (fabs(s2-s1)3*eps)
{
n=2*n;
s1=s2;
s2 = rectangle(a,b,n);
}
cout"По методу треугольников интеграл равен "s2endl;
cout"Число отрезков разбиения n = "nendl;
}
Пояснения: записываем процедуру, вычисляющую интеграл методом средних прямоугольников с заданной точностью eps на отрезке [a,b]. Используем правило двойного пересчёта Рунге для метода k= 2-го порядка точности. Начальное значение суммы s1 = (b-a)*f((a+b)/2) соответствует n=1. С помощью функции rectangle вычисляем значение интеграла s2 при n=2. Находим модуль разности между s1 и s2 и сравниваем с допустимой погрешностью pk-1eps=3eps. Если модуль разности меньше допустимой погрешности, то завершаем вычисление интеграла и принимаем в качестве ответа s2, иначе удваиваем n=2n и опять сравниваем значения двух интегралов, и так далее, пока не будет достигнута необходимая точность
Зарегистрируйся, чтобы продолжить изучение работы
. Для реализации данного алгоритма используем цикл с предусловием While. Алгоритм программы соответствует схеме на рисунке 2.2.
С помощью стандартного оператора cout выводим значение интеграла s2 и полученное число отрезков разбиения n.
double trapezoidal(double a, double b, int n)
{
double h = (b-a)/n;
double x0, x1;
double sum = 0;
for(int i=0; i=n-1; i++)
{
x0=a+i*h;
x1=x0+h;
sum += f(x0) + f(x1);
}
sum *= h/2.0;
return sum;
}
Пояснения: записываем функцию, вычисляющую интеграл методом трапеций при n числе разбиений отрезка интегрирования [a,b]. h – шаг интегрирования. В переменной sum накапливаем значение интегральной суммы, т.е. суммы значений в концах отрезков разбиения. Для вычисления суммы используем цикл for. В завышении умножаем сумму на шаг интегрирования h и делим на 2 (поскольку площадь трапеции равна полусумме значений в концах, умноженную на высоту h) – получаем значение интеграла. Алгоритм программы соответствует схеме на рисунке 2.3.
void trapezoidalE(double a, double b, double eps)
{
double s1,s2;
s1 = (b-a)*(f(a)+f(b))/2;
int n=2;
s2 = trapezoidal(a,b,n);
while (fabs(s2-s1)3*eps)
{
n=2*n;
s1=s2;
s2 = trapezoidal(a,b,n);
}
cout"По методу трапеций интеграл равен "s2endl;
cout"Число отрезков разбиения n = "nendl;
}
Пояснения: записываем процедуру, вычисляющую интеграл методом трапеций с заданной точностью eps на отрезке [a,b]. Используем правило двойного пересчёта Рунге для метода k= 2-го порядка точности. Начальное значение суммы s1 = (b-a)*(f(a)+f(b))/2 соответствует n=1. С помощью функции trapezoidal вычисляем значение интеграла s2 при n=2. Находим модуль разности между s1 и s2 и сравниваем с допустимой погрешностью pk-1eps=3eps. Если модуль разности меньше допустимой погрешности, то завершаем вычисление интеграла и принимаем в качестве ответа s2, иначе удваиваем n=2n и опять сравниваем значения двух интегралов, и так далее, пока не будет достигнута необходимая точность. Для реализации данного алгоритма используем цикл с предусловием While. Алгоритм программы соответствует схеме на рисунке 2.4.
С помощью стандартного оператора cout выводим значение интеграла s2 и полученное число отрезков разбиения n.
double simpson(double a, double b, int n)
{
double h = (b-a)/n;
double x0, x1, x2;
double sum = 0;
for(int i=0; i=n-2; i+=2)
{
x0=a+i*h;
x1=x0+h;
x2=x0+2*h;
sum += f(x0) + 4*f(x1) + f(x2);
}
sum *= h/3.0;
return sum;
}
Пояснения: записываем функцию, вычисляющую интеграл методом Симпсона при n числе разбиений отрезка интегрирования [a,b]
50% курсовой работы недоступно для прочтения
Закажи написание курсовой работы по выбранной теме всего за пару кликов. Персональная работа в кратчайшее время!