Создание класса и его дальнейшее использование в программном продукте для интерполирования функции с помощью полинома Лагранжа
Содержание
Введение ………………………………………………………………….3
- Анализ предметной области. Математическая постановка задачи…………………………………………………………………..4
- Техническое задание …………………………………………………7
- Алгоритм выполнения программы …………………………………10
- Блок-схема ……………………………………………………………11
- Листинг программы ………………………………………………….13
- Тестирование и отладка ПО…………………………………………..18
- Описание программы………………………………………………….21
- Руководство пользователя…………………………………………….23
- Заключение…………………………………………………………… 25
Список используемой литературы ……………………………………..26
Введение
Данная курсовая работа выполнена на языке программирования высокого уровня С++ с использованием компилятора Microsoft Visual Studio 2013. Этот язык был разработан в начале 80-х годов в Bell Laboratories. С++ - расширение С, т.е. он обеспечивает кардинальное преимущество языка С++, как над своим предшественником языком С так и над другими языками высокого уровня: поддержка объектно-ориентированного программирования, перегруженных операций и возможность разработки полномасштабных windows -приложений. Можно сказать, что язык С++ является одним из совершенных и сложных языков программирования на сегодняшний день.
С помощью языка С++ можно решать всевозможные задачи ставящиеся перед современным программистом: написание системных программ, разработка полноценных windows-приложений, объектное моделирование. Благодаря тому, что язык С++ первоначально разрабатывался как язык системного программирования, то он предоставляет программисту широкие возможности для работы с аппаратурой. Но так как язык С++ подвергся полномасштабной обработки, то он обеспечивает пользователя широким набором средств для решения задач объектно-ориентированного программирования, благодаря этому язык С++ позволяет осуществить интеграцию принципов объектно-ориентированного программирования на аппаратный уровень.
В данной курсовой работе была реализовано создание класса и его дальнейшее использование в программном продукте для интерполирования функции с помощью полинома Лагранжа
1.Анализ предметной области.
Интерполяция функция с помощью полиномов Лагранжа.
Интерполяция, интерполирование в вычислительной математике способ нахождения промежуточных значений величины по имеющемуся дискретному набору известных значений.
Многим из тех, кто сталкивается с научными и инженерными расчётами, часто приходится оперировать наборами значений, полученных опытным путём или методом случайной выборки. Как правило, на основании этих наборов требуется построить функцию, на которую могли бы с высокой точностью попадать другие получаемые значения. Такая задача называется аппроксимацией. Интерполяцией называют такую разновидность аппроксимации, при которой кривая построенной функции проходит точно через имеющиеся точки данных.
Рассмотрим систему несовпадающих точек () из некоторой области . Пусть значения функции известны только в этих точках:
Задача интерполяции состоит в поиске такой функции из заданного класса функций, что
- Точки называют узлами интерполяции, а их совокупность интерполяционной сеткой.
- Пары называют точками данных или базовыми точками.
- Разность между «соседними» значениями шагом интерполяционной сетки. Он может быть как переменным, так и постоянным.
- Функцию интерполирующей функцией или интерполянтом.
Интерполяционный многочлен Лагранжа многочлен минимальной степени, принимающий данные значения в данном наборе точек. Для n+1 пар чисел (x0, y0), (x1, y1),…, (xn, yn), где все xj различны, существует единственный многочлен L(x) степени не более n, для которого L(xj) = yj.
В простейшем случае (n=1) это линейный многочлен, график которого прямая, проходящая через две заданные точки.
Лагранж предложил способ вычисления таких многочленов:
где базисные полиномы определяются по формуле:
li(x) обладают следующими свойствами:
- являются многочленами степени n
- li(xi) = 1
- li(xj) = 0 при j i
Отсюда следует, что L(x), как линейная комбинация li(x), может иметь степень не больше n, и L(xi) = yi.
Пример
Найдем формулу интерполяции для f(x) = tan(x) имеющей следующие значения:
Получим
2.Техническое задание
Программа для интерполирования функций с помощью полиномов Лагранжа.
Краткая характеристика области применения
Данное ПО должно применятся в вычислительной математике и связанные с ней научные области. Благодаря интуитивно простому интерфейсу, данное ПО подойдет для широкого круга людей.
Аналоги
Технология нахождения полиномов Лагранжа реализована в пакетах Mathcad и MatLab.Однако для их нахождения нужно построить необходимые алгоритмы. Во вторых, недостатком является и необходимость наличия пакетов Mathcad или же Matlab.
Основание для разработки
Документ, на основании которого ведется разработка
Индивидуальное задание по дисциплине «Технология программирования».
Организация, утвердившая документ
Самарский Государственный Университет Путей Сообщений.
Назначение разработки
Программное обеспечение для интерполирования функций с помощью полиномов Лагранжа позволит упростить данную задачу. Потому что, все алгоритмы уже реализованы в самой программе, и не требуют от пользователя наличия громоздких пакетов типа MatLab или MathCad
3.Требование к программному продукту
Требования к функциональным характеристикам
Разрабатываемое ПО должно реализовывать нахождение полиномов по формуле Лагранжа.
- Интуитивно понятный графический интерфейс
- Легкость в эксплуатации
- Надежность
- Гибкость. Наличие возможности для доработки и усовершенствования
- Программа должна быть реализована на основе ООП
- Программная система должна использовать визуальные требования для ввода исходных данных и вывода результатов
Требования к составу и параметрам технических средств
Для функционирования программы необходим персональный компьютер соответствующий минимальным требованиям к составу данного программного продукта:
- процессор IntelPentium или совместимый,
- объем свободной оперативной памяти 3000 Кб,
- объем необходимой памяти на жестком диске 1000 Кб,
- стандартный VGA монитор,
- стандартная клавиатура,
- манипулятор «мышь»
Требования к информационной и программной совместимости
Программа должна работать под операционной системой Microsoft Windows XP и выше.
Требования к программной документации
В пакет программной системы должен входить «Руководство пользователя» , документ , благодаря которому пользователь ,впервые использующий программный продукт , будет без труда ориентироваться.
Стадии и этапы разработки
Стадии |
Результат |
Время выполнения |
Системный анализ |
Математическая постановка задачи |
1 день |
Проектирование и программная реализация |
Исходный код и графический интерфейс |
4 дня |
Документирование |
Руководство пользователя |
2 дня |
Алгоритм решения задачи
1.Вводим количество узлов интерполяции (N).
2.Вводим элементы массива X и Y.
3.Вычислениям шаг(h), где h=x[1]-x[0].
4.
Листинг программы
#include "Interpolation.h"
#pragma once
namespace InterpolationLagrange {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Сводка для Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: добавьте код конструктора
//
}
protected:
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::GroupBox^ groupBox1;
protected:
private: System::Windows::Forms::Button^ button2;
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::TextBox^ textBox2;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::GroupBox^ groupBox2;
private: System::Windows::Forms::TextBox^ textBox3;
private: System::Windows::Forms::Label^ label3;
private: System::Windows::Forms::DataGridView^ dataGridView1;
private: System::Windows::Forms::DataGridViewTextBoxColumn^ X;
private: System::Windows::Forms::DataGridViewTextBoxColumn^ Y;
private:
/// <summary>
/// Требуется переменная конструктора.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Обязательный метод для поддержки конструктора - не изменяйте
/// содержимое данного метода при помощи редактора кода.
/// </summary>
void InitializeComponent(void)
{
this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
this->button2 = (gcnew System::Windows::Forms::Button());
this->button1 = (gcnew System::Windows::Forms::Button());
this->textBox2 = (gcnew System::Windows::Forms::TextBox());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
this->label2 = (gcnew System::Windows::Forms::Label());
this->label1 = (gcnew System::Windows::Forms::Label());
this->groupBox2 = (gcnew System::Windows::Forms::GroupBox());
this->textBox3 = (gcnew System::Windows::Forms::TextBox());
this->label3 = (gcnew System::Windows::Forms::Label());
this->dataGridView1 = (gcnew System::Windows::Forms::DataGridView());
this->X = (gcnew System::Windows::Forms::DataGridViewTextBoxColumn());
this->Y = (gcnew System::Windows::Forms::DataGridViewTextBoxColumn());
this->groupBox1->SuspendLayout();
this->groupBox2->SuspendLayout();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->dataGridView1))->BeginInit();
this->SuspendLayout();
//
// groupBox1
//
this->groupBox1->Controls->Add(this->button2);
this->groupBox1->Controls->Add(this->button1);
this->groupBox1->Controls->Add(this->textBox2);
this->groupBox1->Controls->Add(this->textBox1);
this->groupBox1->Controls->Add(this->label2);
this->groupBox1->Controls->Add(this->label1);
this->groupBox1->Location = System::Drawing::Point(15, 15);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Size = System::Drawing::Size(250, 220);
this->groupBox1->TabIndex = 0;
this->groupBox1->TabStop = false;
this->groupBox1->Text = L" Ввод данных ";
//
// button2
//
this->button2->Location = System::Drawing::Point(13, 180);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(220, 23);
this->button2->TabIndex = 5;
this->button2->Text = L"Найти решение";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
//
// button1
//
this->button1->Location = System::Drawing::Point(205, 25);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(39, 23);
this->button1->TabIndex = 4;
this->button1->Text = L"Ok";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
//
// textBox2
//
this->textBox2->Location = System::Drawing::Point(78, 147);
this->textBox2->Name = L"textBox2";
this->textBox2->Size = System::Drawing::Size(121, 20);
this->textBox2->TabIndex = 3;
this->textBox2->KeyPress += gcnew System::Windows::Forms::KeyPressEventHandler(this, &Form1::textBox2_KeyPress);
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(124, 27);
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(75, 20);
this->textBox1->TabIndex = 2;
this->textBox1->KeyPress += gcnew System::Windows::Forms::KeyPressEventHandler(this, &Form1::textBox1_KeyPress);
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(10, 150);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(62, 13);
this->label2->TabIndex = 1;
this->label2->Text = L"Введите X:";
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(10, 30);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(108, 13);
this->label1->TabIndex = 0;
this->label1->Text = L"Введите к-во узлов:";
//
// groupBox2
//
this->groupBox2->Controls->Add(this->textBox3);
this->groupBox2->Controls->Add(this->label3);
this->groupBox2->Location = System::Drawing::Point(15, 240);
this->groupBox2->Name = L"groupBox2";
this->groupBox2->Size = System::Drawing::Size(250, 60);
this->groupBox2->TabIndex = 1;
this->groupBox2->TabStop = false;
this->groupBox2->Text = L" Результат ";
//
// textBox3
//
this->textBox3->Location = System::Drawing::Point(55, 27);
this->textBox3->Name = L"textBox3";
this->textBox3->ReadOnly = true;
this->textBox3->Size = System::Drawing::Size(150, 20);
this->textBox3->TabIndex = 1;
//
// label3
//
this->label3->AutoSize = true;
this->label3->Location = System::Drawing::Point(15, 30);
this->label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(34, 13);
this->label3->TabIndex = 0;
this->label3->Text = L"P(x) =";
//
// dataGridView1
//
this->dataGridView1->AllowUserToAddRows = false;
this->dataGridView1->AllowUserToDeleteRows = false;
this->dataGridView1->AllowUserToResizeColumns = false;
this->dataGridView1->AllowUserToResizeRows = false;
this->dataGridView1->ColumnHeadersHeightSizeMode = System::Windows::Forms::DataGridViewColumnHeadersHeightSizeMode::AutoSize;
this->dataGridView1->Columns->AddRange(gcnew cli::array< System::Windows::Forms::DataGridViewColumn^ >(2) {this->X, this->Y});
this->dataGridView1->Location = System::Drawing::Point(275, 15);
this->dataGridView1->Name = L"dataGridView1";
this->dataGridView1->RowHeadersVisible = false;
this->dataGridView1->ScrollBars = System::Windows::Forms::ScrollBars::Vertical;
this->dataGridView1->Size = System::Drawing::Size(154, 285);
this->dataGridView1->TabIndex = 2;
//
// X
//
this->X->Frozen = true;
this->X->HeaderText = L"X";
this->X->Name = L"X";
this->X->SortMode = System::Windows::Forms::DataGridViewColumnSortMode::NotSortable;
this->X->Width = 75;
//
// Y
//
this->Y->Frozen = true;
this->Y->HeaderText = L"Y";
this->Y->Name = L"Y";
this->Y->SortMode = System::Windows::Forms::DataGridViewColumnSortMode::NotSortable;
this->Y->Width = 75;
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(444, 312);
this->Controls->Add(this->dataGridView1);
this->Controls->Add(this->groupBox2);
this->Controls->Add(this->groupBox1);
this->Name = L"Form1";
this->Text = L"Интерполяция методом Лагранжа";
this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
this->groupBox1->ResumeLayout(false);
this->groupBox1->PerformLayout();
this->groupBox2->ResumeLayout(false);
this->groupBox2->PerformLayout();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->dataGridView1))->EndInit();
this->ResumeLayout(false);
}
#pragma endregion
String^ decSeparator;
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
decSeparator = Globalization::NumberFormatInfo::CurrentInfo->NumberDecimalSeparator;
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
if(!int::TryParse(textBox1->Text,(int)n))
{
MessageBox::Show(L"Ошибка! Проверте правильность ввода параметра - n");
return;
}
n = int::Parse(textBox1->Text);
if(!n)
{
MessageBox::Show(L"Ошибка! Проверте правильность ввода n > 0");
return;
}
while(dataGridView1->RowCount != 0) // Удалим все строки из dataGridView1
dataGridView1->Rows->RemoveAt(0);
for(int i=0; i!=n; ++i) // Добавить n строк
dataGridView1->Rows->Add();
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
{
if(!int::TryParse(textBox1->Text,(int)n))
{
MessageBox::Show(L"Ошибка! Проверте правильность ввода параметра - n");
return;
}
n = int::Parse(textBox1->Text);
if(!n)
{
MessageBox::Show(L"Ошибка! Проверте правильность ввода n > 0");
return;
}
double x = 0.0;
if(!Double::TryParse(textBox2->Text,x))
{
MessageBox::Show(L"Ошибка! Проверте правильность ввода параметра - x");
return;
}
Points *points = new Points[n];
for(unsigned int i=0; i!=n; ++i)
{
String ^str;
str = dataGridView1->Rows[i]->Cells[0]->FormattedValue->ToString();
if(!Double::TryParse(str,points[i].x))
{
MessageBox::Show(L"Ошибка! Проверте правильность ввода узлов");
return;
}
str = dataGridView1->Rows[i]->Cells[1]->FormattedValue->ToString();
if(!Double::TryParse(str,points[i].y))
{
MessageBox::Show(L"Ошибка! Проверте правильность ввода узлов");
return;
}
}
textBox3->Text = interpolation.Lagrange(x, points, n).ToString();
delete[] points;
}
private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
if(Char::IsDigit(e->KeyChar))
return;
if(e->KeyChar == (char)Keys::Back)
return;
e->Handled = true;
}
private: System::Void textBox2_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
bool flDecSeparator = false;
if (!(textBox2->Text->Length) && (e->KeyChar == '-'))
return;
if(Char::IsDigit(e->KeyChar))
return;
if(e->KeyChar == (char)Keys::Back)
return;
if(textBox2->Text->IndexOf(decSeparator) != -1)
flDecSeparator = true;
if(flDecSeparator)
{
e->Handled = true;
return;
}
if(e->KeyChar.ToString() == decSeparator)
return;
e->Handled = true;
}
};
}
Блок схема
Руководство пользователя
Назначение системы
Данное ПО разработана специально для широкого круга людей для более быстрого и удобного вычисления интерполяции функции полиномами Ньютона.
Основные возможности
В программе реализованы возможности :
- Ввод данных , в частности ввод массивов путем поочередной записи значений элементов.
- Вывод решения на экран.
- Изменение размеров окна программы.
Установка и удаление системы
Для установки ПО необходимо копировать все файлы системы на жесткий диск.
Запуск системы
Для того, что бы запустить программу необходимо запустить исполняемый файл Interpolation Lagrange.exe из директории программы на жестком диске.
Инструкция использования
При запуске ПО пользователь видит на экране форму (рис. 1), где:
Приглашение ввести количество узлов
Кнопка подтверждения
Таблицы для записи значений X,Y
Приглашение ввести Х
Кнопка “Найти решение”, после нажатия которой вычисляется значение функции
Результат вычисления
Рис 1.Интерфейс программы.
Пример решения задачи
[Расход, л/с] [Диаметр, мм] [Скорость м/с]
[100] л/с [400]мм [1,1] м/с
[100] л/с [450]мм [0,9] м/с
[100] л/с [500]мм [0,75] м/с
[100] л/с [550]мм [0,68] м/с
[100] л/с [600]мм [0,6] м/с
Вы, в таблице из нормативного документа видите, что нашего диаметра трубы (510 мм) просто нету(как и скорости потока который нам нужен в результате)... но зато есть(известно) такое:
диаметр трубы (500)мм - для которого скорость - 0,75 м/с
для диаметра трубы (510)мм т.е X-?
диаметр трубы (550)мм - для которого скорость - 0,68 м/с
В промежуток которого [500....550] попадает наше значение(диаметр) 510 мм и соответственно мы можем интерполировать, то есть найти, как вы уже поняли, промежуточное значение (в данном случаи найти какая будет скорость воды в трубе при пропуске 100 литров для диаметра 510 мм) вам поможет в этом не сложном ремесле подпрограмма интерполятор
1)Количество узлов 5 . Значения для X : 400; 450; 500; 550; 600 . Y:1,1; 0,9;0,75;0,68;0,6
- . Значение точки X, для которого необходимо найти значение 510.Ответ при решении аналитическим способом 0,7318
- Количество узлов 5 . Значения для X : 1,6; 1,7 ; 1,8 ; 1,9 ; 2 . Значения для Y : 1,6416 ; 2,3961 ; 3,3536 ; 4,5441 ; 6. Значение точки X, для которого необходимо найти значение 1,68 Ответ при решении аналитическим способом 2,2299
Заключение
В результате выполнения курсовой работы была разработана программа на языке С++ в среде Microsoft Visual Studio 2013 ,реализующая процесс, описанный в постановке задачи.
Программа не имеет исходных данных .Начальное количество данных может быть изменено в процессе работы программы. Количество узлов и искомый интервал задаются пользователем.
УЧЕБНО -МЕТОДИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ДИСЦИПЛИНЫ
7.1. Литература обязательная
1. Единая система программной документации (ЕСПД).
2. Брауде Э. Технология разработки программного обеспечения.
СПб.: «Питер», 2004. 655 с.
3. Брукс Ф. Мифический человеко-месяц или как создаются программные системы: Пер. с англ. СПб.: Символ-Плюс, 1999. 304 с.
4. Орлов С.А. Технологии разработки программного обеспечения, 2-е изд. СПб.: «Питер», 2003. 473 с.
5. Якобсон А., Буч Г., Рамбо Дж. Унифицированный процесс разработки программного обеспечения.СПб.: «Питер», 2002. 496 с.
7.2. Литература дополнительная
- 6.Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на C++, 2-е изд./Пер. с англ. М.: «Издательство Бином», СПб: «Невский диалект», 1998. 560с.
- 7.Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. СПб.: «Питер», 2001.368 с.
- 8.Йордан Э. Путь камикадзе. Как разработчику программного обеспечения выжить в безнадежном проекте. М.: «Лори», 2003. 255 с.
- 9.Крачтен Ф. Введение в RationalUnifiedProcess/ 2-eизд.: Пер. с англ. М.: Изд. дом «Вильямс», 2002. 240 с.
- 10.Липаев В.В. Проектирование программных средств: учеб. пособие для вузов по спец. «Автом. сист. обр. информ. и упр.». М.: Высш. шк., 1990. 303с.
- 11.Орлик С. Введение в программную инженерию и управление жизненным циклом ПО
http://www.almportal.ru/public/so/book/4-software_lifecycle_models.pdf,
http://www.almportal.ru/public/so/book/2
project_management.pdf
Начало
=0; i<n; ++i
ввод данных:
n, X, x[n], y[n]
Выход Конец
P*=(x-x[j])/(x[i]-x[j])
j=0; i<j; ++j
P = 1.0
result+=P* y[i]
j != i
Создание класса и его дальнейшее использование в программном продукте для интерполирования функции с помощью полинома Лагранжа