Цели:
Повторение основных понятий языка программирования
Изучение методов практического проименения программирования для решения прикладных задач
Знакомство с метоом Монте-Карло для поиска площади геометрической фигуры произвольной формы (интегрирования функции)
Метод Монте-Карло
Предположим, требуется вычислить определённый интеграл
Рассмотрим случайную величину
, равномерно распределённую на отрезке интегрирования . Тогда также будет случайной величиной, причём её математическое ожидание выражается как
, где — плотность распределения случайной величины , равная на участке .
Таким образом, искомый интеграл выражается как
.
Но матожидание случайной величины можно легко оценить, смоделировав эту случайную величину и посчитав выборочное среднее.
Итак, бросаем
точек, равномерно распределённых на , для каждой точки вычисляем . Затем вычисляем выборочное среднее: .
В итоге получаем оценку интеграла:
Точность оценки зависит только от количества точек .
Этот метод имеет и геометрическую интерпретацию. Он очень похож на описанный выше детерминистический метод, с той разницей, что вместо равномерного разделения области интегрирования на маленькие интервалы и суммирования площадей получившихся «столбиков» мы забрасываем область интегрирования случайными точками, на каждой из которых строим такой же «столбик», определяя его ширину как
, и суммируем их площади.
Язык программирования Pascal
Web-среда программирования на языке Pscal - PascalABC
mc.pas
program mc;
var a,b,c,x1,x2,sum,S:real;
N,i:integer;
function ui(x:real):real;
begin
ui:=abs(a*x*x+b*x+c)
end;
BEGIN
write('x1,x2,a,b,c,N: ');
readln(x1,x2,a,b,c,N);
sum:=0;
randomize;
for i:=1 to N do sum:=sum+ui((random(round((x2-x1)*1E5)-x1*1E5))/1E5);
S:=sum/N;
writeln('Площадь: ', S)
END.
Язык программирования С
Среда разработки на языке C и C++ -
Углубленный уровень изучения
Задание:
Рассчитайте площадь фигуры на отрезке [x1;x2], ограниченную осью x и функицией
mc.c
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
float a, b, c;
float ui(float x);
main() {
srand(time(NULL));
printf("Введи x1, x2, a, b, c, N: ");
float x1, x2;
int N;
scanf("%f%f%f%f%f%d", &x1, &x2, &a, &b, &c, &N);
int i;
float S=0;
for(i=0;i<N;i++) S+=ui((float)rand()/RAND_MAX*(x2-x1)+x1)*(fabs(x2-x1));
float s=S/N;
printf("Площадь фигуры: %.4f", s);
}
float ui(float x) {
return fabs(a*x*x+b*x+c);
}
Домашнее задание:
Напишите программу вычисления трапеции на отрезке [x1;x2], если нижнее основание фигуры ограничено осью x, верхнее - линией, заданной функцией f(x) = kx+p.