Вы находитесь на странице: 1из 6

Омский государственный технический университет

Кафедра ИВТ

Дисциплина
«Вычислительные системы и сети»

Лабораторная работа № 2

Численные методы решения задач

Омск, 2019
Введение
На современном уровне техники сложность объектов зачастую не позволяет
разработать для них эффективных математических моделей и тем более -
аналитических методов их решения. К тому же составление мат. модели и
проведение расчёта требует определённой квалификации. Таковы две причины всё
большего распространения численных методов.
Основой численных методов являются не менее сложные математические
теории, их главное отличие — возможность значительно уменьшить долю ручных
вычислений и корректировок мат. модели. Такое упрощение компенсируется
необходимостью многократного повторения расчётных шагов - «итераций», однако
для современных компьютеров это зачастую не является проблемой.

1. Метод Монте-Карло
Суть метода заключается в следующем: для целевой случайной величины
генерируется набор случайных значений, а затем на его основе рассчитываются
требуемые значения.
Метод Монте-Карло имеет множество различных приложений. Он применяется
в следующих областях: в промышленности для моделирования изменчивости
производственных процессов; в физике, химии и биологии для моделирования
разнообразных явлений; в области игр для моделирования искусственного
интеллекта, например, в китайской игре го; в области финансов для оценки
производных финансовых инструментов и опционов.
Современный вариант метода сформировался в рамках Манхэттенского
проекта, где он применялся для моделирования расстояний, которые могут пройти
нейтроны в различных материалах.
Пример: вычисление числа Пи
Рассмотрим вычисление числа Пи с помощью метода Монте-Карло.
Вписав круг в квадрат (диаметр круга равен стороне квадрата), можно выразить
отношение площади круга к площади квадрата следующим образом:

Если мы сможем вычислить это отношение, значит, мы сможем получить


значение числа Пи.
Заполним квадрат точками со случайными координатами. Рассчитаем
отношение количества точек, попавших в круг, к общему количеству точек.
Умножим результат на 4, чтобы получить значение числа Пи.
Чем больше количество точек, тем ближе полученное значение к истинному
значению числа Пи.
Код программы:
#include<iostream>

#include <cstdlib>//for rand


#include <ctime>//for TIME in rand
#include <math.h>//...

using namespace std;

int main() {
::std::srand((unsigned int)::std::time(NULL));

int iterations = 100;


int points=0;
int a;
int b;
// int d;

for (int i=0;i<iterations;i++) {


a = (rand() % (100+1));
b = (rand() % (100+1));
if ( (a*a+b*b)<(100*100) ) points++;
};
cout<<"our Pi: "<< (float)4*points/iterations;

return 0;
}

4. Задания к ЛР
4.1 Изучить код к примеру 1, провести эксперименты с программой:
сделать вывод о влиянии числа «бросков» случайного числа на точность
получаемого ответа;
4.2 Модифицировать код к примеру 1, используя собственный вариант
генератора случайных чисел вместо функции стандартной библиотеки
::std::srand. Сравнить полученные результаты с изначальными. Один из
возможных вариантов основы генератора:
а) Считывание передвижений пользователем мыши в течение около 60 секунд. Для
считывания координат в приложении Windows Forms используется следующая
функция:
POINT p;
if (GetCursorPos(&p))
{
//позиция курсора: p.x p.y
}
Чтобы периодически получать координаты, рекомендуется пользоваться таймером:
#include <iostream>
#include <chrono>
#include <thread>
#include <functional>
void timer_start(std::function<void(void)> func, unsigned int interval)
{
std::thread([func, interval]() {
while (true)
{
func();
std::this_thread::sleep_for(std::chrono::milliseconds(interval));
}
}).detach();
}

void do_something()
{
std::cout << "I am doing something" << std::endl;
}

int main() {
timer_start(do_something, 1000);

while(true);
}

б) Периодическое считывание значений регистров процессора. Для этого можно


использовать ассемблерную инлайн-вставку, где x, y, z – int-переменные основной
программы:
__asm__ (
"mov %%eax, %[X]"
:[X] "=r" (x)
);
__asm__ (
"mov %%ebx, %[Y]"
:[Y] "=r" (y)
);
__asm__ (
"mov %%ecx, %[Z]"
:[Z] "=r" (z)
);
4.3 Оформить отчёт (см. раздел 5).

5. Содержание отчёта по лабораторной работе


- титульный лист (см. приложение на последнем листе);
- описание решенных задач;
- скриншоты программ и результатов их выполнения;
- выводы.
Приложение 1. Титульный лист отчета по лабораторной работе

Министерство образования и науки РФ


Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Омский государственный технический университет»

Кафедра «Информатика и вычислительная техника»

Отчёт по лабораторной работе № ____


по дисциплине
«____»

Выполнил
Студент гр. АБВ-101
Серый И.А. ______________
(подп., дата)

Проверил
Старший преподаватель каф. ИВТ
Звонов А.О. ______________
(подп., дата)

Омск, 201_

Вам также может понравиться