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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KVANTA
 Аватар для KVANTA
3 / 3 / 0
Регистрация: 12.12.2011
Сообщений: 68
#1

Массив - C++

14.12.2011, 17:51. Просмотров 331. Ответов 7
Метки нет (Все метки)

Массив (у0,у1, ... ,уn) представляет собой значения некоторой функции на
отрезке [a,b], причем a=y0,b=yn. Создать класс Integral, в котором
реализовано вычисление определенного интеграла методом прямоугольников,
методом трапеций и методом Симпсона.

Добавлено через 30 секунд
Помогите пожалуйста написать эту прогу С++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2011, 17:51     Массив
Посмотрите здесь:

C++ Безопасный массив (массив с контролем границ)
Условие умножение массив на массив(матрицы) C++
объявить массив 5на5. 3аполнить массив '0' C++
C++ слить массив А и В по 100 элементов в массив С из 200 элементов так,чтобы элементы А и В чередовались по 10 в c++
Передать массив I(10) в массив J(10) в обратной последовательности C++
Передать массив I в массив J в обратной последовательности C++
шаблон функции который принимает в параметры массив количиство елементов и должен найти сумму елементов массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YouDoItWrong
46 / 46 / 7
Регистрация: 29.10.2011
Сообщений: 154
14.12.2011, 18:09     Массив #2
Массив (у0,у1, ... ,уn) как заполняется/откуда берется?
KVANTA
 Аватар для KVANTA
3 / 3 / 0
Регистрация: 12.12.2011
Сообщений: 68
14.12.2011, 18:28  [ТС]     Массив #3
наверное рандом, точных указаний в задании не было
YouDoItWrong
46 / 46 / 7
Регистрация: 29.10.2011
Сообщений: 154
14.12.2011, 18:55     Массив #4
Ну вот пример методом прямоугольников.
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cmath>
 
 
using namespace std;
 
double F(double x) {
    //Функция
}
 
double Integral(vector<double> vec) {
    double h = vec[vec.size()-1] - vec[0] / 10000000;
    return std::accumulate(vec.begin(), vec.end() - 1, 0) * h;
}
 
int main() {
    vector<double> _func;
    for(int i = 0; i <10000000; i++) {
        //тут заполняеться вектор _func (_func.push_back(value))
    }
    cout << Integral(_func) << endl;
    return 0;
}
Ну а все остальное по анологии, просто изменить функцию Integral. Вот формулы:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
0. Формула прямоугольников
   h = (b-a)/N;
   Int (f(x),a,b) = h * (f(x[0])+f(x[1])+...+f(x[N]))
 
1. Формула средних
   h = (b-a)/N;
   Int (f(x),a,b) = h * (f(x[1/2])+f(x[1+1/2])+...+f(x[N-1/2]))
   Выражение "f(x[i+1/2])" означает "значение функции f(x) в точке (x[i]+x[i+1])/2"
 
2. Формула трапеций
   h = (b-a)/N;
   Int (f(x),a,b) = h * (1/2*f(x[0])+f(x[1])+f(x[2])+...+f(x[N-1])+
                       +1/2*f(x[N]))
 
3. Формула Симпсона (N должно быть четным)
   h = (b-a)/N;
   Int (f(x),a,b) = h/3 * (f(x[0])+4*f(x[1])+2*f(x[2])+4*f(x[3])+
                    +2*f(x[4])+...+2*f(x[N-2])+4*f(x[N-1])+f(x[N]))
 
4. Формула Эйлера (в предположении, что известны значения производной
   f'(x) в узлах x[0] и x[N])
   h = (b-a)/N;
   Int (f(x),a,b) = h * (1/2*f(x[0])+f(x[1])+f(x[2])+...+f(x[N-1])+
                    +1/2*f(x[N])) + 1/12*h^2*(f'(x[0])-f'(x[N]))
KVANTA
 Аватар для KVANTA
3 / 3 / 0
Регистрация: 12.12.2011
Сообщений: 68
14.12.2011, 18:56  [ТС]     Массив #5
огромное спасибо
YouDoItWrong
46 / 46 / 7
Регистрация: 29.10.2011
Сообщений: 154
14.12.2011, 19:04     Массив #6
Да незачто, если надо могу выложить примеры кода с использованием метода Монте-Карло.
KVANTA
 Аватар для KVANTA
3 / 3 / 0
Регистрация: 12.12.2011
Сообщений: 68
14.12.2011, 19:43  [ТС]     Массив #7
и такой есть?? а можете эту задачу только полностью написать, а то я сделал по аналогии, но компилятор ругается, буду очень признателен
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2011, 20:56     Массив
Еще ссылки по теме:

Строковый массив в int массив C++
C++ Дан массив А[13], переписать его в массив B
Почему массив не присвоился в другой массив? C++
Преобразовать массив LPWSTR в массив BYTE C++
Массив: Проверить, отсортирован ли массив по возрастанию. C++

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

Или воспользуйтесь поиском по форуму:
YouDoItWrong
46 / 46 / 7
Регистрация: 29.10.2011
Сообщений: 154
14.12.2011, 20:56     Массив #8
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
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
 
double R(const int a,const  int b) {
    return (double)rand()/(double)RAND_MAX*(b-a)+a;
}
 
int main() {
    srand(time(NULL));
    double x,y,integral;
    int p=int();
    for(int i = 0; i < 100000; i++) {
        x = R(0,5);
        y = R(0,5);
        if(pow(x,2.0/3.0) <= (pow(5,2.0/3.0) - pow(y,2.0/3.0)) && pow(y,2.0/3.0) <= (pow(5,2.0/3.0) - pow(x,2.0/3.0))) {
            p++;
        }
    }
    integral = p/100000.0*25;
    cout << integral << endl;
 
    system("pause");
    return 0;
}
Интеграл по этой фигуре ( x^(2/3)+y^(2/3) = 5^(2/3), y = 0, x = 0 (в первой четверти))
Ну какая-то теория по алгоритму:
Код
II. Метод статистических испытаний (метод Монте-Карло)

0. Неформальное введение в метод Монте-Карло интегрирования n-мерных функций

Предположим, нам надо найти объём шара с R=1, находящегося в начале системы
координат. Описываем этот шар кубом. Куб будет иметь длину ребра, равную 2, и
его центр также будет находиться в начале системы координат. Начинаем
генерировать точки со случайными координатами (x,y,z) так, чтобы они находились
внутри куба - т.е. каждая координата будет случайным числом в диапазоне [-1,1].
Для каждой точки определяем, попала она внутрь шара, или нет. Сгенерировав
достаточно большое количество точек, найдем соотношение числа точек, попавших в
шар, к общему числу точек. Это соотношение примерно равно соотношению объёма
шара к объёму куба. Умножив его на объём куба (который легко вычисляется),
получим (приближенно) искомый объём шара.

1. Формальное введение

Пусть имеется многомерный объём V. Равномерно разбросаем в нём N случайных
точек x[1], ..., x[N]. Тогда базовая теорема о приближенной оценке
интеграла от функции f() по многомерному объёму V методом Монте-Карло
утверждает, что интеграл функции f() по многомерному объёму V приближенно равен:
    Integral (f * dV) ~= V * G1,
причем ошибка оценки значения интеграла обратно пропорциональна N и равна:
    E = V * sqrt ((G2 - G1^2) / N),
где
    V  = объем многомерной области
    G1 = среднее арифметическое N значений функции g(),
    G2 = среднее арифметическое N значений функции g()^2.

Иногда требуется найти интеграл функции w() по многомерному объему W сложной
формы, который трудно заполнить равномерно. В этом случае выбирают область V,
которая включает W и может быть без труда заполнена равномерно (например,
многомерный параллелипипед), а функцию w() доопределяют в области V\W (т.е. вне
W, но внутри V) как равную нулю:
    g(x) = w(x), если x принадлежит W,
    g(x) = 0,    если x принадлежит V\W.
Затем к функции g() и области V применяют базовую теорему.

Метод предполагает, что функция g() определена в любой точке области V.

Чем "плотнее" область V облегает W (т.е. чем меньше объем V\W), тем меньше
будет ошибка оценки E. Чем больше число точек N, тем меньше будет ошибка
оценки E.

2. Приложения метода Монте-Карло

А. Нахождение объема области W: для этого полагают w(x)=1, где x принадлежит W

Б. Нахождение массы тела W: при этом предполагается, что функция w() задает
   плотность (в общем случае неравномерную в пространстве)

В. Нахождение координат центра массы тела W: при этом предполагается, что
   функция w() задает произведение координат на плотность r() (в общем случае
   неравномерную в пространстве):
     w(x,y,x) = (x * r(x,y,z), y * r(x,y,z), z * r(x,y,z)) .
   С помощью описанной выше процедуры вычисляют линейные моменты mi для каждой
   координаты, затем находят массу тела m (см. п. Б). Тогда координаты центра
   масс будут определятся как отношение соответствующих линейных моментов к
   массе тела. Например, для трехмерного пространства:
     x = mx / m
     y = my / m
     z = mz / m
Yandex
Объявления
14.12.2011, 20:56     Массив
Ответ Создать тему
Опции темы

Текущее время: 10:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru