Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

посчитать интеграл, метод Монте-Карло

56K
04 февраля 2010 года
Shim
6 / / 01.02.2010
Написал прогу, работает, но препод сказал что неправильно, в чём ошибка ?
Собственно задание: написать программу, которая считает интеграл 1-x*x на интервале [-1;1] методом Монте-Карло (на лекциях этой темы не было).
Препод сказал, что нужно сгенерировать 2 случ. числа, координаты точки, по x [-1,1], по y [0.1], и смотреть, попадает точка в область, ограниченную функцией или нет, как делать дальше я пока не додумался; Сгенерировать от 0 до 1 получилось вот так:

 
Код:
double x = (rand())/RAND_MAX*1.0


Как сгенерировать от -1 до 1 не знаю, ибо если просто число можно умножить на "-1", а для диапазона - ??

Листинг:
Код:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
 
double func(double x)
{
        return 1-x*x;
}
 
int main()
{
        int point_a = -1;
        int point_b = 1;
        int number_of_random=0;
        double s=0;
        printf("how much random points? ");
        scanf("%ld",&number_of_random);
        srand((unsigned)time(NULL));
        for (int i=0;i<number_of_random;i++)
        {
             s+=func(point_a+((double)rand()/RAND_MAX*(point_b-point_a)));
        }
        s=s/(double)number_of_random*(point_b-point_a);
        printf("\nintegral %f \n",s);
        return 0;
}
397
04 февраля 2010 года
SergPas
527 / / 03.02.2007
Цитата: Shim

Как сгенерировать от -1 до 1 не знаю, ибо если просто число можно умножить на "-1", а для диапазона - ??


А для диапозона это будет выглядеть так:

 
Код:
x = 2.0*rand()/RAND_MAX-1.0;
P.S. Оформите код в соответствии с правилами форума.
56K
09 февраля 2010 года
Shim
6 / / 01.02.2010
а можно какую нибудь подсказку, как дальше делать ? а то у меня совсем без вариантов.. :confused:
4.5K
09 февраля 2010 года
e-XperT
127 / / 04.07.2006
Надо так
Код:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
 
double func(double x)
{
        return 1-x*x;
}
 
int main()
{
        int point_a = -1;
        int point_b = 1;
        int number_of_random=0;
        double s=0;
        double x;
        double y;
        printf("how much random points? ");
        scanf("%ld",&number_of_random);
        srand((unsigned)time(NULL));
        for (int i=0;i<number_of_random;i++)
        {
             x = 2.0*rand()/RAND_MAX-1.0; //генерируем x в интервале [-1,1]
             y = 2.0*rand()/RAND_MAX-1.0; //генерируем y в интервале [-1,1]
//если сгенерированное число попало в площадь, ограниченную кривой
//на данной координате значение интеграла увеличивается на 1
             if(fabs(y)<func(x)) s+=1
        }
//Делим полученное значение интеграла на общее число "выбросов"
//метода монте-карло
        s=s/(double)number_of_random*(point_b-point_a);
        printf("\nintegral %f \n",s);
        return 0;
}
56K
10 февраля 2010 года
Shim
6 / / 01.02.2010
Цитата: e-XperT
Надо так



Большущее спасибо, мне по y нужно (0;1), вот так правильно ? :o

 
Код:
y = rand()/RAND_MAX*1.0





[SIZE="3"]
update: вопрос исчерпан, всем кто помогал большое спасибо)[/SIZE]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог