Описание логической структуры
Для отображения русских символов в консоли используется модуль:
#include "locale.h"
setlocale (LC_ALL, "Russian")
При запуске программа требует ввести исходные данные для вычислений: начало интегрирования (a), предел интегрирования (b), точность интегрирования (d) и количество итерации (N). Происходит присваивание значений переменных, необходимых для вычислений.
Затем создается файл data.xls, для записи исследований. В первом столбце записывается критерий точности, во второй номер итерации. Запись производится со второй итерации.
В следующем пункте программы необходимо выбрать тип функции, которую мы будем интегрировать: 1 – для степенной функции; 2 – для функции вида sin(mx). Выбор функции реализуется с помощью оператора выбора switch(f), где f – номер функции.
Для степенной функции вводится степень n.
Вначале вычисление интеграла производится методом трапеций.
Для вычисления интеграла данным способом задаем сперва цикл с параметром, где j задается от 0 до заданного N. Интервал интегрирования h вычисляется следующим выражением - h=(a+b)/(int (pow(2.0,j))*d). Функция pow –функция для возведения в степень, где первый параметр – число, а второй – степень, в которую возводится данное число. Затем вновь используем цикл с параметром, где i задается от 0 до (int (pow(2.0,j))*d). Необходимо учесть, что точность выполняемых операций ограниченна типом данных double. В цикле вычисляем для данной итерации x= a+i*h. Затем в условном операторе проверяем i=0, если да, то коэффициент t=1, иначе t=2. Затем вычисляем значение интеграла по выражению y=t*(h/2)*1/pow(x,n).После сумма, т.е.приближенное значение интеграла при заданных параметрах, вычисляется по формуле s[j]=s[j]+y, т.е. предыдущее значение прибавляется ктекущему. Затем вычисляется критерий точности по формуле coa=abs(s[j]-s[j-1])/s[j-1]).Функция abs возвращает абсолютное значение параметра.Далее происходит запись в файл критерия точности и количества итераций, начиная с j>0.
После этого, вычисляем интеграл методом Симпсона. Единственное различие заключается в том, что перед вычислением интеграла по формулеy=t*(h/3)*1/pow(x,n)происходит проверка на чётность количества разбиений, t=2, если четное разбиение иt=4, если нечетное разбиение. Запись в файл производится аналогично.
Для функции вида sin(mx) мы задаем с клавиатуры коэффициент m. И вычисления по методам трапеций и Симпсона проводятсяпо формулам y=t*(h/2)*sin(m*x)y=t*(h/3)*sin(m*x), соответственно. Все остальные операции происходят так же, как для вычисления интеграла степенной функции.
После вычислений записываемый поток закрывается.
Используемые технические средства
Программа была отлажена и проверена на вычислительной установке PCc процессором IntelCore 2 DuoT5250 1.8 ГГц, ОЗУ 1 Гб работающей под управлением операционной системы Windows 7 Ultimate.
Вызов и загрузка
Для вызова программы необходимо перейти в каталог программы и запустить файл lap.exe.
Входные и выходные данные
Входные данные поступают с клавиатуры. После ввода требуемой величины необходимо нажать Enter. Пример входных данных приведен в пункте 5.2.6.
Текст программы
// lap.cpp: Исследование точности численного интегрирования.
//
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "math.h"
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#include <iostream>
#include "locale.h"
int _tmain(int argc, _TCHAR* argv[])
{
setlocale (LC_ALL, "Russian"); //для отображения русских букв в консоли
FILE *fp;
int d,f,i,j,t,N;
float a,b,h,n,m,x,y,s[100],coa;
printf("Исследование точности численного интегрирования\n\n");
printf("Введите начало интегрирования a=");
scanf("%f",&a);
printf("Введите предел интегрирования b=");
scanf("%f",&b);
printf("Введите количество частей n=");
scanf("%d",&d);
printf("Введите количество итераций N=");
scanf("%d",&N);
// Открытие файла
while((fp=fopen("data.xls","w"))==NULL)
{
puts("Ошибка!Невозможно открыть файл!\nВведите имя файла:\n");
}
h=(b-a)/d;
printf("\nШаг интегрирования h=%.5f\n",h);
printf("\nВыберите функцию:\n");
printf("1) Степенная функция f(x)=1/x^n\n");
printf("2) Функциявида f(x)=sin(m*x)\n");
scanf("%d",&f);
if (f<1 || f>2)
{
printf("Ошибка!Неверный ввод!\n");
scanf("%d",&f);
}
switch(f)
{
case 1:
printf("Введите степень n=");
scanf("%f",&n);
printf("\nВычисление интеграла методом трапеций:\n");
for(j=0;j<=N;j++)
{
h=(b-a)/(int (pow(2.0,j))*d);
s[j]=0;
for(i=0;i<=(int (pow(2.0,j))*d);i++)
{
x=a+i*h;
if(i==0)
t=1;
else
t=2;
y=t*(h/2)*1/pow(x,n);
s[j]=s[j]+y;
}
if (j>0)
{
coa=abs((s[j]-s[j-1])/s[j-1]);
printf("Критерий точности %.7f Количество итераций %d\n",coa,j);
fprintf(fp,"%.7f\t",coa);
fprintf(fp,"%d\t\n",j);
}
}
printf("Суммаметодомтрапеций S= %.7f\n",s[1]);
fprintf(fp,"%.7f\n",s[1]);
printf("\nВычисление интеграла методом Симпсона:\n");
for(j=0;j<=N;j++)
{
h=(b-a)/(int (pow(2.0,j))*d);
s[j]=0;
for(i=0;i<=(int (pow(2.0,j))*d);i++)
{
x=a+i*h;
if(i==0||i==d)
t=1;
else
{
if(i%2==0)
t=2; //если четное разбиение
else
t=4; //если нечетное разбиение
}
y=t*(h/3)*1/pow(x,n);
s[j]=s[j]+y;
}
if (j>0)
{
coa=abs((s[j]-s[j-1])/s[j-1]);
printf("Критерий точности %.7f Количество итераций %d\n",coa,j);
fprintf(fp,"%.7f\t",coa);
fprintf(fp,"%d\t\n",j);
}
}
printf("СуммаметодомСимпсона S= %.7f\n",s[1]);
fprintf(fp,"%.7f\n",s[1]);
break;
case 2:
printf("Введитекоэффицент m=");
scanf("%f",&m);
printf("\nВычисление интеграла методом трапеций:\n");
for(j=0;j<=N;j++)
{
h=(b-a)/(int (pow(2.0,j))*d);
s[j]=0;
for(i=0;i<=(int (pow(2.0,j))*d);i++)
{
x=a+i*h;
if(i==0)
t=1;
else
t=2;
y=t*(h/2)*sin(m*x);
s[j]=s[j]+y;
}
if (j>0)
{
coa=abs((s[j]-s[j-1])/s[j-1]);
printf("Критерий точности %.7f Количество итераций %d\n",coa,j);
fprintf(fp,"%.7f\t",coa);
fprintf(fp,"%d\t\n",j);
}
}
printf("Суммаметодомтрапеций S= %.7f\n",s[1]);
fprintf(fp,"%.7f\n",s[1]);
printf("\nВычисление интеграла методом Симпсона:\n");
for(j=0;j<=N;j++)
{
h=(b-a)/(int (pow(2.0,j))*d);
s[j]=0;
for(i=0;i<=(int (pow(2.0,j))*d);i++)
{
x=a+i*h;
if(i==0||i==d)
t=1;
else
{
if(i%2==0)
t=2; //если четное разбиение
else
t=4; //если нечетное разбиение
}
y=t*(h/3)*sin(m*x);
s[j]=s[j]+y;
}
if (j>0)
{
coa=abs((s[j]-s[j-1])/s[j-1]);
printf("Критерий точности %.7f Количество итераций %d\n",coa,j);
fprintf(fp,"%.7f\t",coa);
fprintf(fp,"%d\t\n",j);
}
}
printf("СуммаметодомСимпсона S= %.7f\n",s[1]);
fprintf(fp,"%.7f\n",s[1]);
break;
}
// Закрытиефайла
fclose (fp);
printf("\nДля выхода нажмите любую клавишу...\n");
_getch();
}