Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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




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

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

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

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

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

Вычислим площадь одного прямоугольника si=h*f(xi). Сумма si площадей полученных прямоугольников является приближенным значением интеграла: .

Однако одно приближение не позволяет оценить точность, с которой вычислено значение интеграла, необходимо найти следующее приближение. Для этого увеличим n в два раза, т.е. n = 2n. Аналогично найдем .

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

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

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

#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 (четное) более мелких отрезков.

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

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

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

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

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

#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.

Рис.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. Решение уравнения методом итераций.

Преобразуем уравнение к виду .

#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





Поделиться с друзьями:


Дата добавления: 2016-12-06; Мы поможем в написании ваших работ!; просмотров: 415 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Студенческая общага - это место, где меня научили готовить 20 блюд из макарон и 40 из доширака. А майонез - это вообще десерт. © Неизвестно
==> читать все изречения...

2346 - | 2305 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.008 с.