Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
UQuark
1 / 1 / 0
Регистрация: 22.12.2016
Сообщений: 13
#1

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

06.03.2017, 19:12. Просмотров 312. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Метод прямоугольников (всё ли правильно?) (C++):

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

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

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

Всё ли я правильно делаю ? - C++
Сегодня, считай, первый день как начал изучать С++. В качестве компиляции использую Microsoft Visual C++ 2010 Express. И хочу узнать Ваше...

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

Глаз замылился, всё ли правильно? - C++
Доброго времени суток! Ребят, гляньте, нет утечки памяти: char **table = new char*; for (int i=0; i &lt; ROWS; i++) ...

5
likehood
930 / 789 / 273
Регистрация: 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
6081 / 5392 / 1878
Регистрация: 14.04.2014
Сообщений: 22,368
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 / 273
Регистрация: 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
Привет! Вот еще темы с ответами:

ошибки или всё не правильно. - C++
вводится текст.разбивается на слова.....и если слова не одинаковы то выводятся..... ничего не получается(помогите пожалуйста.... ...

Написание уравнения. Всё ли правильно? - C++
Доброго времени суток уважаемые! Запутался в написании уравнения, вроде все правильно, но программа зануляет ответ. Уравнение...

Метод левых и правых прямоугольников - C++
Здравствуйте, написал функцию для левых прямоугольников для приближенного вычисления определенного интеграла. Помогите написать для правых...

Найти интеграл, метод прямоугольников - C++
Помогите пожалуйста считает что интеграл равен 0. Считал в маткакде получился ответ 13,963 /// ConsoleApplication3.cpp: определяет...


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

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

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