- •Оглавление
- •Поиск простых чисел
- •Описание работы
- •Параллельный алгоритм # 4: последовательный перебор простых чисел
- •Синхронизация доступа к одноэлементному буферу Описание работы
- •Синхронизация приоритетного доступа к многоэлементному буферу Описание работы
- •Методические указания
- •Клеточная модель "игра жизнь" дж. Конвея Описание работы
- •Трансляция ОрепМр-программ
- •Метод трапеций
- •Метод Симпсона
Трансляция ОрепМр-программ
Трансляция ОрепМР-программы выполняется со специальным ключом. В операционной системе Linux транслятор Intel® Compiler использует ключ - openmp, например:
#ifort -о ту_prog prog_source.f9 0 -openmp
В операционной системе MSW тс1о\¥8командная строка выглядит следующим образом:
#ifort prog_source.f9 0 /Qopenmp
основано
на его замене конечной суммой:
Приближенное
вычисление определенного интеграла
Приближенное
вычисление интеграла:

где и’|. - числовые коэффициенты, а хк - точки отрезка [х0, xj. Приближенное равенство: / ~ 1„ называется квадратурной формулой, точки хк - узлами квадратурной формулы, а числа wk - коэффициентами квадратурной формулы. Разные методы приближенного интегрирования отличаются выбором узлов и коэффициентов. От этого выбора зависит погрешность квадратурной формулы:
Rn = V=In •
Метод трапеций
Интегрирование методом трапеций основано на использовании кусочно-линейного приближения для интегрируемой функции. Пусть F(x) - гладкая функция на интервале \a,b\, и этот интервал делится на
п равных частей, каждая длиной h = b-an.
Приближение метода трапеций:

где f = F(a + jh) - значение интегрируемой функции в точке a+jh.
Метод Симпсона
Идея трехточечного метода Симпсона заключается в следующем. Пусть хт - это средняя точка интервала [х0. х, | и пусть О(х) - единственный полином второй степени, который интерполирует (приближает) подынтегральную функцию F{x) по точкамх0, хГТ1 их,. Искомый интеграл аппроксимируется интегралом от функции Q(x):
![]()
Эта оценка точна, если F(x) является полиномом степени 3.
Обычно используются составные квадратурные формулы, когда промежуток интегрирования разбивается на N подынтервалов и простая формула Симпсона применяется на каждом из этих подынтервалов:
![]()
Недостатком рассмотренного метода является то, что он не дает возможности явно задать точность вычисления интеграла. Точность связана с количеством точек разбиения. От этого недостатка свободны методы интегрирования с адаптивным выбором шага разбиения. Если трехточечный метод Симпсона не дает достаточную точность на за-
данном интервале, он делится на 3 равные части, и метод вновь применяется к каждой из полученных частей.
ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ № 6
Выполнить распараллеливание последовательных программ, предназначенных для вычисления определенных интегралов: распараллеливание производится с помощью MPICH.
Получить навык анализа простых программ и выявления в них потенциального параллелизма, применить для распараллеливания ОрепМРи MPI.
Сравнить трудоемкость обоих подходов и эффективность полученного результата.
На основании результатов, полученных при выполнении заданий данной лабораторной работы, написать отчет, в котором содержатся выводы об эффективности различных способов распараллеливания исходного последовательного кода и трудоемкости реализации этих способов на практике.
Пример 1
В программе на языке Fortran 90 реализован метод трапеций. programintegraltrapez integer, parameter :: divno =100 real, parameter :: xO = 0., xl = 1. !3.14159 real, external :: F real:: result
result = trapezium(F, xO, xl, div no) print *, result
end
real function trapezium(F, xO, xl, divno)
real, external:: F real, intent(in) :: xO, xl integer, intent(in) :: div no real:: x, dx, sum integer :: j dx = (xl - xO) / div no sum = F(x0) + F(xl) x = xO do j = 1, div no - 1
х = х + dx sum = sum + 2.0 * F(x) end do
trapezium = dx * sum /2.0 end
real function F(x) real, intent(in) :: x !F= sinfx)
F = 4./(l.+x**2)
End
Пример 2
В программе на языке Fortran 90 реализован метод Симпсона. programintegral simps integer, parameter :: div no =100 real, parameter :: xO = 0., xl = 1. !3.14159 real, external:: F real:: result
result = simpson(F, xO, xl, div no) print *, result end
real function simpson(F, xO, xl, divno) real, external:: F real, intent(in) :: xO, xl integer, intent(in) :: div no
real:: x, dx, sum integer :: j
dx = (xl - xO) / (2.0 * div no) sum = F(x0) + F(xl) x = xO doj = 1, 2 * div no - 1 x = x + dx if (mod(j, 2) /= 0) then sum = sum + 4.0 * F(x) else
sum = sum + 2.0 * F(x) end if end do
simpson = dx * sum /3.0 end
