Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 численные методы

.doc
Скачиваний:
13
Добавлен:
28.06.2021
Размер:
78.85 Кб
Скачать

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

Кафедра ИВТ

Дисциплина

«Вычислительные системы и сети»

Лабораторная работа № 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;

}

  1. Задания к ЛР

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_

Соседние файлы в предмете Вычислительные Системы