Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
UQuark
1 / 1 / 0
Регистрация: 22.12.2016
Сообщений: 13
#1

Метод прямоугольников (всё ли правильно?)

06.03.2017, 19:12. Просмотров 356. Ответов 5
Метки нет (Все метки)

Доброго времени суток
Задачка такова
Использовать метод прямоугольников. Для
Построения прямоугольника использовать середину отрезка.
Y=-2*x^2+3*x+6
Y=X+2

Я, вроде как, что-то сделал, но, как говорилось в одном хорошем фильме, "меня терзают смутные сомнения"
Собственно, ниже привожу код

Кликните здесь для просмотра всего текста

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
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <cmath>
#include <conio.h>
#include <stdlib.h>
float f1(float x)
{
    return -2 * pow(x, 2) + 3 * x + 6;
}
 
float f2(float x)
{
    return x + 2;
}
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
    float Xa, Xb, dx, N, x, S=0,S1=0,S2=0;
    cout << "Введите левую границу интервала" << endl; //Первая часть решения
    cin >> Xa;                                             //Вводим границы интервала, на котором хотим найти площадь
    cout << "Введите правую границу интервала" << endl;
    cin >> Xb;
    cout << "Введите количество точек разбиения" << endl;
    cin >> N;
    dx = ((Xb - Xa) / N);                                //Считаем шаг
    cout << "Шаг составляет =" << dx << endl;            //Выводим шаг
 
    for(float x = Xa+dx/2; x <= Xb-dx/2; x += dx/2) //Начинаем крутить цикл. Так как используется середина отрезка, то dx/2
    {
        x += dx/2;
        S1 += f1(x);
        S2 += f2(x);
    }
    S = dx*(S2 - S1); // по идее dx можно вынести
 
 
    cout << "Площадь заданной фигуры =" << S << endl;
 
 
    system("pause");
 
    return 0;
 
}

Соответственно, вопроса 2 : я сделал всё норм (ну если взять немногим менее 22400 точек, то ответ в точности как в онлайн калькуляторах, если взять 50, к примеру, то там -8,9964 )
И если не норм, то можете посоветовать исправление?

И второй вопросик, а как избавиться от отрицательного знака в ответе ? Ну то есть очевидно, что если говорим о площади, то понятно, что подразумевается та самая 9, но всё-таки

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2017, 19:12
Ответы с готовыми решениями:

метод прямоугольников
помогите пожалуйста написать код программы. Составить алгоритм и записать...

Метод прямоугольников
Для построения прямоугольника использовать правый конец отрезка. y=sqrt(x),...

С++ Метод прямоугольников
Помогите пожалуйсто с задачкой. Метод вроде понятен, но составить прграмму...

Метод прямоугольников
Здравствуйте! Есть выражение: y = −2^2 + 3x + 6, y = x + 2. Использовать...

Метод трапеций и прямоугольников
Выручайте.Если до понедельника не сделаю-не поставит препод зачет.Необходимо...

5
likehood
930 / 789 / 378
Регистрация: 25.12.2016
Сообщений: 2,627
Завершенные тесты: 3
06.03.2017, 20:23 #2
1) Заменить float на double, это повысит точность.
2) При вычислении площади брать значение по модулю: std::abs( ... )
1
UQuark
1 / 1 / 0
Регистрация: 22.12.2016
Сообщений: 13
06.03.2017, 20:31  [ТС] #3
Спасибо за ответ, подправил. С double на 1,5к точек ровно 9 выходит.
0
nmcf
6259 / 5571 / 2531
Регистрация: 14.04.2014
Сообщений: 23,463
06.03.2017, 20:36 #4
А почему шаг dx/2? У тебя же количество прямоугольников удваивается.
В Википедии посмотри пример в статье Метод прямоугольников.
0
UQuark
1 / 1 / 0
Регистрация: 22.12.2016
Сообщений: 13
06.03.2017, 20:56  [ТС] #5
Цитата Сообщение от nmcf Посмотреть сообщение
А почему шаг dx/2? У тебя же количество прямоугольников удваивается.
В Википедии посмотри пример в статье Метод прямоугольников.
Я смотрел, меня это смутило немного.
Просто если я беру не dx пополам, то там далековато от истины будет, я пытался понять, в чём проблема, в итоге решил с dx/2 попробовать. Ответ стал красивым.

P.s. хотя был вариант переделать последнюю строку в : S = dx*((S2-S1)*2), оставив dx, но я не знаю, насколько подобное уместно
0
likehood
930 / 789 / 378
Регистрация: 25.12.2016
Сообщений: 2,627
Завершенные тесты: 3
06.03.2017, 21:14 #6
Тут ещё возможен пропуск одной итерации из-за погрешности сравнения вещественных чисел.

Чтобы этого избежать можно условие в 32 строке заменить на x < Xb, при этом шаг приращения x должен быть равен dx, на что указал nmcf.

Другой способ - использовать целочисленный параметр цикла i = 1...N.
0
06.03.2017, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2017, 21:14

Метод правых прямоугольников
Составить программу приближенного вычисления площади фигуры, ограниченной...

Всё ли я правильно делаю ?
Сегодня, считай, первый день как начал изучать С++. В качестве компиляции...

Найти интеграл, метод прямоугольников
Помогите пожалуйста считает что интеграл равен 0. Считал в маткакде получился...


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

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

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