Поделиться Поделиться

Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков

Использованием циклов для решения задач численными методами.

Цель работы: Научиться применять циклические алгоритмы для решения задач, использующих численные методы.

Теоретические сведения

Вычисление значения с заданной точностью методом прямоугольников

Для вычисления первого приближения интеграла разделим отрезок [a,b], отвечающий пределам интегрирования (рис.4.1), на n равных частей (n = 4), определим значения xi = a+h*i-h/2; h = (b-a)/n.

Вычислим площадь одного прямоугольника si=h*f(xi). Сумма si Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 109 площадей полученных прямоугольников является приближенным значением интеграла: Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 110 .

Однако одно приближение не позволяет оценить точность, с которой вычислено значение интеграла, необходимо найти следующее приближение. Для этого увеличим n в два раза, т.е. n = 2n. Аналогично найдем Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 111 .

Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 112

Рис.4.1 Вычисление интеграла методом прямоугольников

Требуется вычислить значение интеграла с точностью e, поэтому проверим условие |S1 - S2|<e. Если условие выполняется, то S2 принимается за искомое значение интеграла; если не выполняется, то последнее выполненное значение S2 считается предыдущим, т.е. S1 = S2. После этого удвоим число точек деления отрезка и вычислим новое значение S2. Процесс удвоения n и вычисления S2 будем продолжать до тех пор, пока модуль разности S1 и S2 не станет меньше e.

Пример 4.1. Вычисление интеграла Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 113 методом прямоугольников.

#include <iostream>

#include <conio.h>

#include <math.h>

using namespace std;

#define Pi 3.14159

int main()

{unsigned long i, n = 4;

float a,b,x,h,S1,S2,eps,exact;

a = 0; b = 3/(2*Pi); eps = 0.001;

S1 = 0;

h = (b – a)/n;

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

for (i = 1; i<=n; i++)

{ x = a + i*h – h/2;

S1 = S1+ (1/(5–3*cos(x)))*h;

}

//Вычисляем текущее приближение и сравниваем его с предыдущим

do {n = 2*n;

h = (b – a)/n;

S2 = 0;

for (i = 1; i<=n; i++)

{x = a + i*h – h/2;

S2 = S2 + (1/(5–3*cos(x)))*h;

}

exact = fabs(S1 – S2);

S1 = S2;

} while(exact>eps);

cout << "S = " << S2;

return 0;

}

Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков

Для нахождения интеграла вычислим площадь под графиком функции, являющейся подынтегральным выражением(рис.4.2). Здесь a и b - пределы интегрирования; xi = a + i(b - a)/n.

Для использования формулы Симпсона разбиваем отрезок [a,b] на n (четное) более мелких отрезков.

Формула Симпсона имеет вид:

Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 114

Здесь n - четное число делений интервала интегрирования; xi = a + i(b – a)/n.

Алгоритм состоит в циклическом выполнении расчетов f(xi). При этом следует отдельно рассмотреть случаи для границ интегрирования f(a) и f(b) и учесть, что при нечетном номере вычисляемого элемента значение функции умножается на 4, при четном - на 2. При конечных значениях отрезка умножение не производится.

Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 115

Рис.4.2. Вычисление интеграла по формуле Симпсона.

Пример 4.2. Вычисление интеграла Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 116 по формуле Симпсона.

#include <iostream>

#include <conio.h>

#include <math.h>

using namespace std;

int main()

{unsigned long i, n;

float a,b,x,h,y,s;

cout << "Четное количество делений -> ";

cin >> n;

a = 0; b = 1.8;

s = 0; x = a;

h = (b – a)/n;

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

{ y = (1/(1+sqrt(x));

x = x + h;

if (i % 2 != 0) s = s + 4*y;

else if (i == 0 || i == n) s = s + y;

else s = s + 2*y;

}

s*=h/3;

cout << "S = " << s;

}

Вычисление с заданной точностью e корня уравнения F(x)=0

Методом простых итераций

Пусть корень уравнения находится на отрезке [a,b] (рис.4.3). Для использования метода итераций исходное уравнение F(x) = 0 нужно привести к виду x = f(x). Если известно начальное приближение к корню x = x1, то подставив его в правую часть уравнения x = f(x), получим новое приближение x2 = f(x1). Затем аналогичным образом получим
x3 = f(x2),..., xk+1 = f(xk).

Итерационный процесс сходится к корню уравнения, если |fў(x)|<1 на отрезке, содержащем корень уравнения. Если выполняется неравенство –1<f ΄(x)<0, то корень уравнения всегда находится на отрезке [xk, xk+1] или [xk+1,xk] и условие окончания итерационного процесса имеет вид неравенства [xk+1 – xk]<e.

Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 117

Рис.4.3. Метод простых итераций

Переход от уравнения F(x) = 0 к уравнению f(x) можно осуществить следующим образом. Умножим левую и правую части уравнения F(x) = 0 на некоторую константу h и добавим к обеим частям уравнения неизвестное x. Эти действия не изменяют корней уравнения:

hF(x) + x = 0*h + x;

hF(x) + x = x.

Обозначив f(x) = hF(x) + x, перейдем к уравнению x = f(x). Величину h необходимо выбрать такой, чтобы выполнялись неравенства |f '(x)|<1, f '(x)<0 на отрезке, содержащем корень уравнения.

Исходными данными для программы, соответствующей приведенному алгоритму, являются грубое значение корня и точность вычисления. Условием выхода из итерационного процесса служит неравенство |xg –x t|<e, при этом искомым значением является xt

Пример 4.3. Решение уравнения Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 118 методом итераций.

Преобразуем уравнение к виду Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков - Инвестирование - 119 .

#include <iostream>

#include <conio.h>

#include <math.h>

using namespace std;

int main()

{ float xt, xg = 2.3, eps = 0.001, x = 5*eps;

int step = 0;

while (fabs(x)>=eps)

{ xt = -0.2*(xg*xg*xg – 2*xg*xg –3)+xg;

x = xt-xg;

step++;

xg = xt;

}

cout << "Корень = " << xt << " и получен на шаге " << step;

getch();

return 0;

}


Решение уравнения f(x) = 0 с заданной точностью e