Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

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

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

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

}