- •Введение
- •1.Анализ предметной области. Интерполяция функция с помощью полиномов Лагранжа.
- •2.Техническое задание
- •Краткая характеристика области применения
- •Организация, утвердившая документ
- •3.Требование к программному продукту
- •Требования к составу и параметрам технических средств
- •Требования к информационной и программной совместимости Программа должна работать под операционной системой Microsoft Windows xp и выше. Требования к программной документации
- •Стадии и этапы разработки
- •Алгоритм решения задачи
- •Листинг программы
- •Заключение
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

