Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Saimon91
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 9
#1

Неправильно считает интеграл

29.10.2010, 18:35. Просмотров 1243. Ответов 12
Метки нет (Все метки)

написал два метода Симпсона и Монте-Карло, но 2-ой не правильно считает, помогите пожалуйстаю Значение у Симпсона получается: 1.3352, у Монте-Карло: 0.05338.
Вот метод Монте-Карло:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double CalcMonte(int n)// метод Монте-Карло
{
    double part = 0.0;
    double part1 = 3.14;
    double integral = 0.0; 
    for (int i = 0; i <= n; i++)
    {
        double x = (3.14 / double(n)) * rand();
        double y = (1.0 / double(n)) * rand();
        if (fabs(y) <= pow(sin(x), 3) + cos(x))
                    integral++;
    }
    integral = integral / (double)n * (part1 - part);
    return integral;
}
Зарание спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2010, 18:35
Ответы с готовыми решениями:

Strlen неправильно считает
Вот код: #include &lt;stdio.h&gt; #include &lt;string.h&gt; void...

Почему неправильно считает матрицу?
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include&quot;stdio.h&quot; #define N 3...

Программа неправильно считает еженедельную зарплату каждого служащего
Есть задача: Компания платит своим служащим как администраторам (это те, кто...

Треугольник задан координатами своих вершин. Составить программу вычисления его площади. Почему-то считает неправильно
Задачу нужно решить с помощью функций.Почему-то все время вместо площади...

Не считает cos
привет всем , что не так в коде . не считает cos.Поправьте код,спасибо заранее....

12
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
29.10.2010, 18:37 #2
1)рандомное число должно быть от 0 до n, у вас просто rand().
2) к тому же у вас есть отрезок функции, где f(x)<0
if (fabs(y) <= pow(sin(x), 3) + cos(x))
игрек у вас и так всегда положительный.
0
Saimon91
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 9
29.10.2010, 19:00  [ТС] #3
И как же тогда построить условие??
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
29.10.2010, 19:19 #4
Если функция больше нуля одно условие, если меньше то другое. Для y>0 своя площадь,для y<0 - своя, потом из первой вычитаешь вторую.
0
Saimon91
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 9
29.10.2010, 20:13  [ТС] #5
А можно как-нибудь код накропать, а то мне еще 2 задачи делать и как-то уже влом за нее опять браться))
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
29.10.2010, 20:30 #6
хоть честно ...
C++
1
2
3
4
double x = (3.14 / double(n)) * rand()%n;
double y = (2.0 / double(n)) * rand()%n;
if ((y>0)&&(y <= pow(sin(x), 3) + cos(x))) integral++;
if ((y<0)&&(y >= pow(sin(x), 3) + cos(x))) integral--;
C++
1
2
integral = integral * 2*(part1 - part)/ (double)n ;
return integral;
не проверял, тоже что то влом
до цикла
C++
1
srand((unsigned)time(NULL));
и надо подключить #include <time.h>, да и n не забудьте побольше сделать.
1
Saimon91
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 9
29.10.2010, 21:32  [ТС] #7
чесно чесно могу даже условия написать)) а за это спасибо

Добавлено через 57 минут
че эт написал гдеи x и y объявляем: expression must have integral or enum type
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
29.10.2010, 22:14 #8
C++
1
double x = (3.14 / double(n)) * (rand()%n);
- так попробуй, точне не знаю. Да и объявлять x и y по-хорошему - не в цикле.
0
Saimon91
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 9
29.10.2010, 22:17  [ТС] #9
все заработало, спасибо осталось чуть отладить: ответ все равно не верен
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
29.10.2010, 22:21 #10
Цитата Сообщение от Saimon91 Посмотреть сообщение
все заработало, спасибо осталось чуть отладить: ответ все равно не верен
покажи код целиком и какой n пишешь.

Добавлено через 1 минуту
А... значения же y<0 нет в рандоме.
0
Saimon91
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 9
29.10.2010, 22:39  [ТС] #11
n ввожу 10000
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
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
double simpson(int n); //Метод Симсона
double CalcMonte(int n); // Метод Монте-Карло
 
// тут метод симпсона))
double CalcMonte(int n)// метод Монте-Карло
{
    double part = 1.0;
    double part1 = 3.14;
    double integral = 0.0; 
    srand((unsigned)time(NULL));
    for (int i = 0; i <= n; i++)
    {
        double x = (3.14 / double(n)) * (rand() % n);
        double y = (1.0 / double(n)) * (rand() % n);
        if ((y > 0) && (y <= pow(sin(x), 3) + cos(x))) 
            integral++; 
        if ((y < 0) && (y >= pow(sin(x), 3) + cos(x)))
            integral--;
    }
    integral = integral * 2 * (part1 - part) / (double)n ;
    return integral;
}
Добавлено через 15 минут
Цитата Сообщение от KuKu Посмотреть сообщение
А... значения же y<0 нет в рандоме.
поставил отрец значения ,но не пойму зачем когда считаем integral удваивать его с ним получили 2.5483 а без него 1.2811 близко к Симпсону??
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
29.10.2010, 22:50 #12
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
#include <iostream>
#include <math.h>
#include <time.h>
double CalcMonte(int n)// метод Монте-Карло
{
        double xmin = 0.0;
        double xmax = 3.14;
        double ymin = -2;
        double ymax = 2;
        double integral = 0.0;
        double x,y,f; 
        
        for (int i = 0; i < n; i++)
        {
                x = xmin + ((xmax-xmin)/100)*(rand()%100);
                y = ymin + ((ymax-ymin)/100)*(rand()%100);
                f=pow(sin(x), 3) + cos(x);
                if ((y <= f)&&(f>0)&&(y>0)) integral++;
                if ((y >= f)&&(f<0)&&(y<0)) integral--;
 
        }
        integral = integral*(ymax-ymin)*(xmax-xmin)/n ;
        return integral;
} 
int main()
{
    srand((unsigned)time(NULL));
    double z=CalcMonte(100000);
    std::cout << z << "\n" ;
    system("pause");
    return(0);
}
как то так вродь норм.

Добавлено через 2 минуты
Цитата Сообщение от Saimon91 Посмотреть сообщение
поставил отрец значения ,но не пойму зачем когда считаем integral удваивать его с ним получили 2.5483 а без него 1.2811 близко к Симпсону??
удвоение или нет зависит от области, у тебя просто формулы все не в общем виде были.
1
Saimon91
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 9
29.10.2010, 22:52  [ТС] #13
О! большое спасибо
0
29.10.2010, 22:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2010, 22:52

не считает корень
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; int main() {...

Не считает среднее число
#include &lt;stdio.h&gt; main() { int count, x, s, ch; ...

Почему не считает время?
#include &lt;stdio.h&gt; #include &lt;time.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru