Так как вычисления происходят по статичным формулам, удовлетворительными будут тесты с каждой функцией
Ниже приведены некоторые результаты работы программы при вводе данных для известных функций.
Таблица 4.1 – Описание тестов программы
Входные данные | Результат |
1 4 5 -10 10 | The approximate value of the integral: 101.103 The exact value of the integral: 100.847 Absolute error: -0.256148 Relative error: 0.253996% |
1 4 5 -100 100 | The approximate value of the integral: 1000.01 The exact value of the integral: 1000.08 Absolute error: 0.0692462 Relative error: 0.00692407% |
1 -1 5 10 50 | The approximate value of the integral: 199.85 The exact value of the integral: 201.695 Absolute error: 0.313153 Relative error: 0.263796% |
Руководство пользователя по работе с программой
Установка программы.
Скомпилировать программу g++ main.cpp –o outputfile
Запуск программы.
Запустить исполняющий файл./outputfile
Рисунок 5.2 – Интерфейс программы
Ввод данных с клавиатуры.
Следовать указаниям, появляющимся на экране.
Рисунок 5.3 – Пример работы с программой
Ввод данных из файла.
Необходимо ввести имя файла. Файл должен находиться в одной директории с программой.
Файл должен содержать информацию в следующем виде.
Таблица 5.1 – Пример оформления входного файла.
Input.txt |
a b c mini max n |
Где:-1000<=a,b,c<=1000, -1000<= mini,max<=1000, 2<=n<=5
Примечание.
Программа тестировалась и корректно работает в системе
Ubuntu 18.04, x86_64, RAM-4Gb, CPU-1.8Ggz
Скомпилированная программа занимает 19,264 байт
Заключение
Разработанный программный продукт соответствует поставленным задачам, протестирован и готов для работы.
Программа вычисления интеграла методом Гаусса-Лежандра может найти практическое применение, как и в учебном процессе так и в научных и практических целях.
Список использованных источников
|
1. Статья с неустановленным авторством https://qps.ru/ZuM60, - Режим доступа https://qilab.phys.msu.ru, свободный.(Дата обращения 10.06.2018)
Приложение А
Блок-схема программы
Приложение Б
Листинг программы
Файл main.cpp
#include <fstream>
#include <cstring>
#include <iostream>
#include <cmath>
#include "input_number.cpp"
using namespace std;
double a1, b1, c1, a, b;
int n,func_chose,type_input;
void start(){
cout << "****This program can help you calculate integral of Gauss-Legendre method****\n\
\n\
***Chose the function for next working***\n\
\n\
1.y = a*x^3 + b*x + c\n\
2.y = a *sin(x+b)+c\n\
3.y=a/(x+b)+c\n" << endl;
}
double function(double x){
double func_array[3] = {a1*pow(x,3)+b1*x+c1, a1*sin(x+b1)+c1, (a1/(x+b1))+c1};
return func_array[func_chose];
}
double primitive_function(double x){
double func_array[3] = {(a1*pow(x,4))/4 +(b1*pow(x,2))/2+c1*x, -a1*cos(b1+x)+c1*x, a1*log(abs(b1+x))+c1*x};
}
int main(){
start();
func_chose = (int)input_number("Input yor function => ",1,3);
type_input = (int)input_number("1. keyboard input\n or \n2. File input\n",1.0,2.0);
if (type_input == 1){
a1 = input_number("Input A coefficient => ",-1000,1000);
b1 = input_number("Input B coefficient => ",-1000,1000);
c1 = input_number("Input C coefficient => ",-1000,1000);
a = input_number("Low limit integration => ",-1000,1000);
b = input_number("High limit integration => ",-1000,1000);
n = (int)input_number("Separate interval from 2 to 5 => ",2,5);
}
else {
int file_flag = 1;
int allgood_flag = 1;
while (allgood_flag)
{
string file_name;
cout<< "Type file_name => ";
cin >>file_name;
ifstream file(file_name);
file>>a1;
file>>b1;
file>>c1;
file>>a;
file>>b;
file>>n;
file.close();
if (a1+b1+c1+a+b+n!= 0) file_flag=0;
else{
cout<<"File is not exixt"<<endl;
}
if (a1>=-1000 && a1<=1000 && b1>=-1000 && b1<=1000 && c1>=-1000 && c1<=1000 && a>=-1000 && a<=1000 && b>=-1000 && b<=1000 && n>=2 && n<=5) allgood_flag = 0;
else cout<<"Incorrect data in file " << endl;
}
}
|
double weight[4][5]={
{1,1},
{0.555555556, 0.888888889, 0.555555556},
{0.347854845, 0.652145155, 0.652145155, 0.347854845},
{0.236926885, 0.478628670, 0.568888889, 0.478628670, 0.236926885}
};
double sum = 0;
double step = (b-a)/n;
double Ig = 0;
double h=(b-a)/n;
double xi;
double Ei;
for (int i=1; i<=n; i++)
{
xi = a +i*h;
Ei = ((b+a)/2)+((b-a)/2)*xi;
Ig+=((b-a)/2)*weight[n-2][i-1]*function(Ei);
}
double Integral_of_gauss = Ig;
cout<< "\n\nThe approximate value of the integral: " << Integral_of_gauss <<endl;
double Integral_target=primitive_function(b)-primitive_function(a);
cout<< "The exact value of the integral: " << Integral_target <<endl;
double absolute_error=(abs(Integral_target) - abs(Integral_of_gauss));
cout<< "Absolute error: " << absolute_error <<endl;
double relative_error = (abs(absolute_error)/Integral_target) * 100;
cout<< "Relative error: " << relative_error << "%" <<endl;
return 0;
}
Файл input_number.cpp
#include <cstring>
using namespace std;
double input_number(char prompt[], double lowest, double biggest) {
double result;
do {
cout << prompt;
cin >> result;
if (cin.fail()) {
cin.clear();
cin.ignore(100500, '\n');
cout << "Bad number:(" << endl;
} else if (!(result >= lowest && result <= biggest)) {
cout << "Bad number:(" << endl;
}
} while (result < lowest or result > biggest);
return result;
}