Помощь в блок схеме

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
asacyra
Сообщения: 1
Зарегистрирован: 09 дек 2013, 16:47

Кадому дали код. Лично у меня вычесление интеграла методом трапеции

Код: Выделить всё

namespace Reshenie
{
    public partial class Form1 : Form
    {
        public Double sum = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            double c;
            String stc;

            for
            (double db = 2; db < 4; db += 0.001)
            {
                c = (32 + 28 * db - 9 * db * db) * 0.001;
                sum += c;
            }

            
 stc = Convert.ToString(sum);
 textBox6.Text=stc;

        }
    }
}
не пойму алгоритм поэтому не могу написать блок схему. Учусь первый год и начинали с самого сложного. Помогите пожалуйста. Заранее спасибо.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Это не метод трапеций, а метод прямоугольников.

Во-первых, для чего это нужно? Определённый интеграл можно посчитать на бумаге, взяв первообразную функции и посчитав разность первообразных в двух точках (пределах интегрирования). Но это можно сделать только в том случае, если у нас есть человек, умеющий брать интегралы. Если же у нас в наличии есть компьютер и есть подинтегральная функция, то единственное, чем мы можем воспользоваться, это физическим смыслом интеграла, а так же способностью компьютера выполнить тысячи операций, которые мы бы замучались делать на бумаге.

И так, каков физический смысл интеграла? Со школы мы знаем, что это площадь фигуры, ограниченная сверху графиком функции, снизу осью X, а слева и справа вертикальными прямыми вырезающими кусок из "пирога" бесконечной функции (именно эти прямые и являются пределами интегрирования). При чём если график функции выше оси X, то площадь у нас положительная, а если ниже, то отрицательная. Понятно, что если наша функция линейна, то площадь подобной фигуры считается очень просто. Что же нам делать, если если график функции достаточно сложен? Вот тут-то, вооружившись смекалкой, мы и воспользуемся способностью компьютера быстро выполнить множество операций.

Для начала предположим, что мы взяли точку на функции ровно посередине нашего отрезка и провели через неё линию, параллельную оси X. У нас получился большой прямоугольник. Воспользуемся школьной формулой и перемножим одну сторону прямоугольника на другую и получим площадь. Понятно, что найденная площадь лишь приблизительно равна площади искомой фигуры. Делаем следующий шаг. Разбиваем отрезок на две равные части. И на каждом отрезке в центре берём точку на графике, строим прямоугольник, считаем его площадь, а затем складываем площади двух прямоугольников. Что получилось? Полученное число всё ещё не является искомой площадью, но приближает её уже лучше, чем наш первый большой прямоугольник. Самый главный вывод, который мы должны сделать из этого упражнения, это то, что чем на большее количество отрезков мы разобьём исходный отрезок, тем более ближе окажется сумма площадей маленьких прямоугольничков к искомой площади сложной фигуры.

Теперь немного формул.
Предположим, у нас есть функция f(x) и её нужно проинтегрировать на отрезке от a то b. Зная математику 9-го (если не ошибаюсь) класса, мы можем найти первообразную F(x) и затем вычислить интеграл, как F(b) - F(a). Оставим это лишь для заметки. С помощью этой формулы мы сможем проверить правильность работы нашей программы.

Теперь перейдём к численному вычислению интеграла (иными словами площади). Предположим, что мы введём некую переменную x0, которая пробежит отрезок [a, b] с крохотным шагом 0.001. Для каждого такой x0 мы должны постоить крохотный прямоугольничек и вычислить его площадь. Понятно, что высота будет равна f(x0) (здесь мы для простоты взяли значение функции на левой границе, а не в центре), а ширина - 0.001. Затем мы должны сложить все прямоугольники.

Код: Выделить всё

double f(double x)
{
   // здесь может быть любая функция, но я взял функцию из твоего примера
   return 32 + 28*x - 9*x*x;
}

...

double sum = 0.0;

for (double x0 = 2; // это наше а
     x0 < 4; // это наше b
     x0 += 0.001 // на каждой итерации цикла увеличиваем x0 на оговореный шаг
     )
{
   double s = f(x0) * 0.001; // вычисляем площадь маленького прямоугольника
   sum += s; // добавляем её к сумме площадей остальных прямоугольников
}
Теперь сравни то, что тут написано с твоим кодом, и ты найдёшь много общего.

Очень надеюсь, что алгоритм я объяснил достаточно понятно, чтобы ты сам смог составить его блок схему.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить