Описание логической структуры

Для отображения русских символов в консоли используется модуль:

#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();

}

Наши рекомендации