2 численные методы
.docОмский государственный технический университет
Кафедра ИВТ
Дисциплина
«Вычислительные системы и сети»
Лабораторная работа № 2
Численные методы решения задач
Омск, 2019
Введение
На современном уровне техники сложность объектов зачастую не позволяет разработать для них эффективных математических моделей и тем более - аналитических методов их решения. К тому же составление мат. модели и проведение расчёта требует определённой квалификации. Таковы две причины всё большего распространения численных методов.
Основой численных методов являются не менее сложные математические теории, их главное отличие — возможность значительно уменьшить долю ручных вычислений и корректировок мат. модели. Такое упрощение компенсируется необходимостью многократного повторения расчётных шагов - «итераций», однако для современных компьютеров это зачастую не является проблемой.
Метод Монте-Карло
Суть метода заключается в следующем: для целевой случайной величины генерируется набор случайных значений, а затем на его основе рассчитываются требуемые значения.
Метод Монте-Карло имеет множество различных приложений. Он применяется в следующих областях: в промышленности для моделирования изменчивости производственных процессов; в физике, химии и биологии для моделирования разнообразных явлений; в области игр для моделирования искусственного интеллекта, например, в китайской игре го; в области финансов для оценки производных финансовых инструментов и опционов.
Современный вариант метода сформировался в рамках Манхэттенского проекта, где он применялся для моделирования расстояний, которые могут пройти нейтроны в различных материалах.
Пример: вычисление числа Пи
Рассмотрим вычисление числа Пи с помощью метода Монте-Карло.
Вписав круг в квадрат (диаметр круга равен стороне квадрата), можно выразить отношение площади круга к площади квадрата следующим образом:
Е сли мы сможем вычислить это отношение, значит, мы сможем получить значение числа Пи.
Заполним квадрат точками со случайными координатами. Рассчитаем отношение количества точек, попавших в круг, к общему количеству точек. Умножим результат на 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.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_