Форум программистов, компьютерный форум CyberForum.ru

Рассчет определенного интеграла методом Монте-Карло. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Дана квадратная матрица. Заменить нулями все ее элементы, расположенные на главной диагонали и выше ее http://www.cyberforum.ru/cpp-beginners/thread772215.html
Дана квадратная матрица порядка N. Заменить нулями все ее элементы, расположенные на главной диагонали и выше ее. Вывести матрицу в исходном и преобразованном виде. Значение N задать при помощи ввода, а саму матрицу сформировать из случайных чисел в диапазоне от 0 до 100.
C++ a=*b Что это значит? Подскажите пожалуйста! http://www.cyberforum.ru/cpp-beginners/thread772207.html
Дана строка символов до точки. Выделить в ней все русские буквы, сделав их заглавными C++
Дана строка символов до точки. Выделить в ней все русские буквы, сделав их заглавными
C++ Длинный факториал
Здравствуйте уважаемые форумчане!, Помогите реализовать программу длинного факториала, очень нужно.
C++ в чем разница между void f(int &n) и void f(int &&n) http://www.cyberforum.ru/cpp-beginners/thread772180.html
:help:
C++ Класс кубик. вывод результата Суть проблемы в том, что в первый раз метод вызывается дважды и выводится 2 раза. Не могу определить почему. Код: # include <iostream> using namespace std; class dice { int d; подробнее

Показать сообщение отдельно
Зосима
 Аватар для Зосима
4786 / 3155 / 293
Регистрация: 02.04.2012
Сообщений: 6,047
Записей в блоге: 13
Завершенные тесты: 1
26.01.2013, 14:50     Рассчет определенного интеграла методом Монте-Карло.
Simply me, лапка, теорию ты понимаешь верно! Интеграл это по сути площадь, ограниченная кривой.
В методе Монте-Карло мы, как ты верно заметила, выделяем прямоугольную область по х от a до b, а по y от min(y), до max(y), как ты верно заметила, площадь этого прямоугольника равна:
S = (b-a)*(max(y)-min(y))
Затем мы "загаживаем" эту область случайгыми числами с равномерным законом распределения и считаем общее число точек N и сколько из них оказалось ниже кривой M, тогда отношение количеств будет примерно равно отношению плошадей области Sk и под кривой:
M/N = Sk/S;
Причем чем больше точек тем более равным будет соотношение
Вспоминая, что площадь под кривой это есть интеграл, получаем:
Int_ab = Sk = S*M/N;
Чуток подправил программу:
c - это макс. функции, d - это мин. функции, соответственно подправил вычисления случ. величин.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma hdrstop
#include <math.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
 
#pragma argsused
double func(double x, int n)
{
return pow(x,n);                             //степенная функция
}
int main(int argc, char* argv[])
{
        int n,i, st;
        double a, b, c, d;
        printf("st: ");                       //степень подинтегральной функции
        scanf("%d",&st);
        printf("\na: ");                    //нижний предел
        scanf("%d",&a);
        printf("\nb: ");                    //верхний предел
        scanf("%d",&b);
        printf("\nn: ");                    //число точек
        scanf("%d",&n);
        if (func(a,st)>=func(b,st))
        c=func(a,st);                    //максимальное значение функции
        d=func(b,st); //мин. значение ф-ции 
        else
        c=func(b,st);
 //max
        d=fucc(a,st); //min
        double *x=new double[n];
        double *y=new double[n];
        srand(time(NULL));
        int count=0;
        for  (i=0; i<n; i++)
        {
        x[i]=a+(b-a)*rand();                //случайные точки
 X
        y[i]=d+(c-d)*rand();
        if (y[i]<func(x[i],st))     
        count++;
        }
        double integral=count*(b-a)*(c-d)/n;
        printf("\nIntegral=%f", integral);
        getch();
        return 0;
}
Добавлено через 12 минут
Стоит заметить, что такое вычисление макс. и мин. как тут (c = func(a,st), например), справедливо только для монотонных функций!, а степенные ф-ции не все монотонны! Так например парабола (st=2) в точке x=-1 и в точке x=1 принимает одинаковое значение поэтому c = d и s = 0 и интеграл соответственно тоже!
Поэтому неплохо для начала найти макс. и мин. значения ф-ции на всем промежутке, т.е. рассчитать ее с каким-то мелким шагом и найти макс и мин значения массива:
C++
1
2
3
4
5
6
7
8
9
double x
c = func(a,st); //max
d = func(a, st); // min
for (x=a; x<=b; x+=(b-a)/500.0)
{
if (func(x,st)>c)  c=func(x,st);
if (func(x,st)<d)  d=func(x,st);
}
// и т.д.
(поправь меня, если ошибся, я не наСильник )

Добавлено через 3 минуты
PS: В этом разделе мы играемся с Матлабом

Добавлено через 1 час 42 минуты
Ах да! Забыл уточнить лапка, тебе программа нужна в MATLAB или на C++ ? Если на плюсах, то я перенесу сообщения в соответствующий раздел
 
Текущее время: 07:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru