Нахождение значения определенного интеграла с помощью метода трапеций в C++

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    212,38 Кб
  • Опубликовано:
    2016-03-17
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Нахождение значения определенного интеграла с помощью метода трапеций в C++

Старооскольский технологический институт им. А.А. Угарова

"Национальный исследовательский технологический университет "МИСиС"

Кафедра автоматизированных и информационных системы управления










Курсовая работа

по дисциплине «Технология программирования»









Старый Оскол, 2015 уч. год

1. Геометрический смысл

Определённый интеграл как площадь фигуры  численно равен площади фигуры, ограниченной осью абсцисс, прямыми x = a и x = b и графиком функции f(x).

 

Рисунок 1

Интегрирование - это непосредственный метод, при котором интеграл путем тождественных преобразований подынтегральной функции (или выражения) и применения свойств интеграла приводится к одному или нескольким табличным интеграла.

Виды:

·        Метод прямоугольников

·        Метод парабол (формула Симпсона)

·        Метод трапеций

·        Метод Монте Карло

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

Рисунок 2

Таким образом, наша площадь (синяя штриховка) приближается суммой площадей трапеций (красный цвет). Отсюда и название метода. Легко заметить, что метод трапеций даёт значительно лучшее приближение, чем метод прямоугольников (при одинаковом количестве отрезков разбиения). И, естественно, чем больше более мелких промежуточных отрезков мы рассмотрим, тем будет выше точность.

. Суть метода трапеций

Поставим перед собой следующую задачу: пусть нам требуется приближенно вычислить определенный интеграл , где подынтегральная функция y=f(x) непрерывна на отрезке[a; b].

Разобьем отрезок [a; b] на n равных интервалов длины h точками. В этом случае шаг разбиения находим каки узлы определяем из равенства.

Рассмотрим подынтегральную функцию на элементарных отрезках.

Возможны четыре случая (на рисунке показаны простейшие из них, к которым все сводится при бесконечном увеличении n):

Рисунок 3

На каждом отрезке  заменим функцию y=f(x) отрезком прямой, проходящей через точки с координатами  и. Изобразим их на рисунке синими линиями:

Рисунок 4

В качестве приближенного значения интеграла  возьмем выражение , то есть, примем .

Давайте выясним, что означает в геометрическом смысле записанное приближенное равенство. Это позволит понять, почему рассматриваемый метод численного интегрирования называется методом трапеций.

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

Рисунок 5


Таким образом, мы подошли к сути метода трапеций, которая состоит в представлении определенного  интеграла в виде суммы интегралов вида  на каждом элементарном отрезке и в последующей приближенной замене

.


. Оценка абсолютной погрешности метода трапеций

Абсолютная погрешность метода трапеций оценивается как

.


 

Рисунок 6


Рисунок 7


3. Программа

.cpp

#include "calc.h"

#include "math.h"namespace std;func(double x)

{y = (3 * tan(x) + 2) / (x*x + 4 * x + 1);y;

}IntegeralBS(double a, double b, int n)

{h = (b - a) / n;result = (func(a) + func(b)) / 2;x;(int j = 1; j <= n - 1; j++)

{= a + j*h;= result + func(x);

}= result*h;result;

}.h

//Мы объявлем здесь ф-ии. А тело их в cpp

//Потому что компилируются h файлы, а выполняются cpp файлыfunc(double x);IntegeralBS(double a, double b, int n);.h

#include "Calc.h"; //Подключаем файл с функциями для рассчета интеграла CalcIntegralForm {

//Подключаем библиотеки (пространства имен) для работы с формой

using namespace System;namespace System::Windows::Forms;

/// <summary>

/// Summary for MyForm

/// </summary>

//Класс нашей формыref class MyForm: public System::Windows::Forms::Form

{:(void)

{(); //Создание компонентов (элементов на форме)

//

//TODO: Add the constructor code here

//

}:

/// Clean up any resources being used.

/// </summary>

~MyForm()

{(components)

{components;

}

}

//Объявлены компоненты

// ^ - указатель: System::Windows::Forms::Label^ label1;: System::Windows::Forms::NumericUpDown^ numericUpDownA;: System::Windows::Forms::NumericUpDown^ numericUpDownB;:: System::Windows::Forms::Label^ label2;: System::Windows::Forms::NumericUpDown^ numericUpDownN;: System::Windows::Forms::Label^ label3;: System::Windows::Forms::Button^ button1;: System::Windows::Forms::Label^ labelRes;:

/// <summary>

/// Required designer variable.

/// </summary>::ComponentModel::Container ^components;

//region для группировки кода

#pragma region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

//Создание компонентовInitializeComponent(void)

{::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(MyForm::typeid));>label1 = (gcnew System::Windows::Forms::Label());>numericUpDownA = (gcnew System::Windows::Forms::NumericUpDown());>numericUpDownB = (gcnew System::Windows::Forms::NumericUpDown());>label2 = (gcnew System::Windows::Forms::Label());>numericUpDownN = (gcnew System::Windows::Forms::NumericUpDown());>label3 = (gcnew System::Windows::Forms::Label());>button1 = (gcnew System::Windows::Forms::Button());>labelRes = (gcnew System::Windows::Forms::Label());

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDownA))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDownB))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDownN))->BeginInit();>SuspendLayout();

//

// label1

// >label1->AutoSize = true;>label1->Location = System::Drawing::Point(12, 9);>label1->Name = L"label1";>label1->Size = System::Drawing::Size(16, 13);>label1->TabIndex = 0;>label1->Text = L"a:";

//

// numericUpDownA

// >numericUpDownA->DecimalPlaces = 5;>numericUpDownA->Location = System::Drawing::Point(34, 7);>numericUpDownA->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1000, 0, 0, 0 });>numericUpDownA->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1000, 0, 0, System::Int32::MinValue });>numericUpDownA->Name = L"numericUpDownA";>numericUpDownA->Size = System::Drawing::Size(68, 20);>numericUpDownA->TabIndex = 1;

//

// numericUpDownB

// >numericUpDownB->DecimalPlaces = 5;>numericUpDownB->Location = System::Drawing::Point(34, 33);>numericUpDownB->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 2000, 0, 0, 0 });>numericUpDownB->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1000, 0, 0, System::Int32::MinValue });>numericUpDownB->Name = L"numericUpDownB";>numericUpDownB->Size = System::Drawing::Size(68, 20);>numericUpDownB->TabIndex = 3;>numericUpDownB->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 15, 0, 0, 0 });

//

// label2

// >label2->AutoSize = true;>label2->Location = System::Drawing::Point(12, 35);>label2->Name = L"label2";>label2->Size = System::Drawing::Size(16, 13);>label2->TabIndex = 2;>label2->Text = L"b:";

//

// numericUpDownN

// >numericUpDownN->Location = System::Drawing::Point(34, 59);>numericUpDownN->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1000000, 0, 0, 0 });>numericUpDownN->Name = L"numericUpDownN";>numericUpDownN->Size = System::Drawing::Size(68, 20);>numericUpDownN->TabIndex = 5;>numericUpDownN->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 10000, 0, 0, 0 });

//

// label3

// >label3->AutoSize = true;>label3->Location = System::Drawing::Point(12, 61);>label3->Name = L"label3";>label3->Size = System::Drawing::Size(16, 13);>label3->TabIndex = 4;>label3->Text = L"n:";

//

// button1

// >button1->Location = System::Drawing::Point(12, 85);>button1->Name = L"button1";>button1->Size = System::Drawing::Size(90, 23);>button1->TabIndex = 6;>button1->Text = L"Рассчет";>button1->UseVisualStyleBackColor = true;>button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);

//

// labelRes

// >labelRes->AutoSize = true;>labelRes->Location = System::Drawing::Point(12, 121);>labelRes->Name = L"labelRes";>labelRes->Size = System::Drawing::Size(65, 13);>labelRes->TabIndex = 7;>labelRes->Text = L"Результат: ";

//

// MyForm

// >AutoScaleDimensions = System::Drawing::SizeF(6, 13);>AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;>ClientSize = System::Drawing::Size(216, 152);>Controls->Add(this->labelRes);>Controls->Add(this->button1);>Controls->Add(this->numericUpDownN);>Controls->Add(this->label3);>Controls->Add(this->numericUpDownB);>Controls->Add(this->label2);>Controls->Add(this->numericUpDownA);>Controls->Add(this->label1);>FormBorderStyle = System::Windows::Forms::FormBorderStyle::Fixed3D;>Icon = (cli::safe_cast<System::Drawing::Icon^>(resources->GetObject(L"$this.Icon")));>MaximizeBox = false;>Name = L"MyForm";>Text = L"Integral";

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDownA))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDownB))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->numericUpDownN))->EndInit();>ResumeLayout(false);>PerformLayout();

}

#pragma endregion

//Это основной расчет: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {a = (double)numericUpDownA->Value;b = (double)numericUpDownB->Value;(b > a)

{n = (int)numericUpDownN->Value;result = IntegeralBS(a, b, n);>Text = result.ToString();

}

{::Show ("Неверно заданы пределы интегрирования (a должно быть меньше b)");

}

}

};

}.cpp

#include "MyForm.h"namespace CalcIntegralForm;

[STAThreadAttribute] //Атрибут указывает, что программа будет начинаться с метода main (точка входа)main(array<System::String ^> ^args)

{

// Application - это класс приложения::EnableVisualStyles(); //Включаеям визуальные стили (форма рисовалась)::SetCompatibleTextRenderingDefault(false); //Текст обрабатывает с помощью.net

// Создаем экземпляр формы (этого класса MyForm) и передаем эту форму в приложение и оно её рисует

//gcnew создание экземпляра класса::Run(gcnew MyForm());0;

}

Таблица 1. Результат выполнения программы:

a

b

n

result

1

0

15

1000

2,15746161654175

2

0

14

999

5,74822536767904

3

1

11

1000

4,97019203763698

4

3

15

250

0,946253773264964




Вывод

Для написания данной программы я использовала язык C++ и среду программирования Visual Studio Community 2015. C++- чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов. Visual Studio Community 2015 - это полнофункциональная интегрированная среда разработки. Эта среда программирования имеет ряд преимуществ. Мощные, эффективные возможности для кодирования, инструментами кроссплатформенных разработок для Windows. В ней находится большое количество различных библиотек, в которых содержится множество полезных функций. Также, здесь очень удобно работать с графическим интерфейсом. Это осуществлено с помощью программная платформа, Visual Studio.NET Framework. Данные преимущества существенно облегчают процесс написания программы.

Похожие работы на - Нахождение значения определенного интеграла с помощью метода трапеций в C++

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!