Смекни!
smekni.com

Исследование точности численного интегрирования 2 (стр. 5 из 5)

fclose(f);

Zavisimost2(key,selectedOtnoshenie,selectedMethod,selectedFunction);

}

//файл ReturnKurs.cpp, здесь описанны функции для подсчетов, вычислений, решений и тому подобное...

#include "stdafx.h"

#include "Kursovoy.h"

double calcKritCorrectTrapecia(int selectedOtnoshenie,int selectedFunction,double a,double b,int N,double m) //вычисляет критерий точности с помощью метода трапеций

{

double prevI,I,tempI;

prevI=Trapecia(N/2,a,b,selectedFunction,m);

I=Trapecia(N,a,b,selectedFunction,m);

if(selectedOtnoshenie==2) tempI=analitIntegral(selectedFunction,a,b,m);

if(selectedOtnoshenie==1) tempI=prevI;

return(abs((prevI-I)/tempI));

}

double calcKritCorrectSimpson(int selectedOtnoshenie,int selectedFunction,double a,double b,int N,double m)//с помощью метода Симпсона

{

double prevI,I,tempI;

prevI=Simpson(N/2,a,b,selectedFunction,m);

I=Simpson(N,a,b,selectedFunction,m);

if(selectedOtnoshenie==2) tempI=analitIntegral(selectedFunction,a,b,m);

if(selectedOtnoshenie==1) tempI=prevI;

return(abs((prevI-I)/tempI));

}

double Trapecia(int N,double a,double b,int selectedFunction,double m) //вот ОН - сам метод трапеций

{

double I,h,x; //переменные значение интеграла, шаг по пределу интегрирования, значение аргумента на данном шаге

x=a;

h=(b-a)/N; //так вычислется h

I=h*(selectedFunctionValue(selectedFunction,b,m)+selectedFunctionValue(selectedFunction,a,m))/2;//первое значение интеграла при не разбиении его вообще на отрезки

for(int i=0;i<N;++i) //на каждом шаге

{

x=x+h;

I=I+h*selectedFunctionValue(selectedFunction,x,m);//к значению прибавляется значение функции в данной точке умноженное на значение аргумента

}

return I; //возвращается значение интеграла (конечно же не точное, в ином случае смысла в этой программе не было бы совсем)

}

double Simpson(int N,double a,double b,int selectedFunction,double m) //не менее важный метод Симпсона

{

double I,h,x; //тоже самое

h=(b-a)/N;

I=h*(selectedFunctionValue(selectedFunction,b,m)+selectedFunctionValue(selectedFunction,a,m))/3;//но первое значение чуть по другой формуле

x=a;

for(int i=1;i<N;++i) //два цикла, для четных x и нет, этот для четных

{

x=x+2*h; //т.е от первоначального значения отдаляемся на два шага

I=I+2*h*selectedFunctionValue(selectedFunction,x,m)/3; //и прибавляем

i++;

}

x=a-h; //для нечетных нужно первый раз отдалиться на один h

for(int i=0;i<N;++i)

{

x=x+2*h; //а затем уже делать по два шага

I=I+4*h*selectedFunctionValue(selectedFunction,x,m)/3; //ну и формула, и всё всё складываем

i++;

}

return I; //возвращаем полученное значение

}

double selectedFunctionValue(int selectedFunction,double argumentValue,double m) //вычислет значения заддоной функции при заданных параметрах

{

switch(selectedFunction)

{

case 1:return (m/(argumentValue*argumentValue));break;

case 2:return (m/(argumentValue));break;

case 3:return (sin(m*argumentValue));break;

default:return 0;break;

}

}

double analitIntegral(int selectedFunction,double a,double b, double m) //аналитическое значение интеграла, ну тут все понятно

{

switch(selectedFunction)

{

case 1:return m*((1/a)-(1/b));break;

case 2:return m*((log(b))-(log(a)));break;

case 3:return 1/m*((cos(m*a))-(cos(m*b)));break;

default:return 0;break;

}

}

//файл Select.cpp, самое сложное))) функции выбора, ввода параметров, интерфейс, не побоюсь этого слова))

#include "stdafx.h"

#include "Kursovoy.h"

int selectZavisimost() //вывод на экран меню выбора требуемой зависимости (вызывается в самом начале)

{ int numberZavisimost;

Zagolovok();

cout<<"Выберите зависимость:&bsol;n"

<<"1. кол-во итераций от критерия точности&bsol;n"

<<"2. точность от кол-ва итераций&bsol;n"

<<"Выбранная зависимость - ";

cin>>numberZavisimost;

return numberZavisimost;

}

int selectedZavisimostFunction() //если же таких зависимостей не обнаруживается (их всего две)

{

int selectedZavisimost=selectZavisimost();

while (selectedZavisimost!=1&&selectedZavisimost!=2)

{

cout<<"Данная зависимость не обнаружена, выберите заново..."; //то выводим на экран такое сообщение,

selectedZavisimost=selectZavisimost(); //и даем возможность, т.е заставляем, выбрать снова

}

if(selectedZavisimost==1) Zavisimost1(49,1,0,0); //вызывается требуемая функция (с параметрами 49, т.е дальнейший выбор данных будет полным)

if(selectedZavisimost==2) Zavisimost2(49,1,0,0);

return selectedZavisimost; //а ничкому не возвращает ничего, ну и пусть

}

int selectOtnoshenie() //меню выбора делителя для критерия точности

{ int numberOtnoshenie;

cout<<"&bsol;nВыберите делитель при вычислении критерия точности:&bsol;n"

<<"1. значение интеграла на предыдущем прохождении&bsol;n"

<<"2. аналитическое значение интеграла&bsol;n"

<<"Выбранный делитель - ";

cin>>numberOtnoshenie;

return numberOtnoshenie;

}

int selectedOtnoshenieFunction(FILE*f,int selectedZavisimost)

{

system("cls");

Zagolovok();

cout<<"Выбранная зависимость - " //выводит номер уже выбранной ранее зависимости

<<selectedZavisimost;

int selectedOtnoshenie=selectOtnoshenie();

while (selectedOtnoshenie!=1&&selectedOtnoshenie!=2) //и пока нужный делитель для вычисления критерия не будет выбран

{

cout<<"Данный пункт не найден..."; //выводится данное сообщение

selectedOtnoshenie=selectOtnoshenie(); //и снова выбираем

}

fprintf(f,"%s%d%s","Выбранное отношение для критерия точности -",selectedOtnoshenie,"&bsol;t&bsol;n");

return selectedOtnoshenie;

}

int selectMethod() //далее всё так же как и в предыдущих пунктах выбора

{ int numberMethod;

cout<<"&bsol;nВыберите метод:&bsol;n"

<<"1. Метод трапеций&bsol;n"

<<"2. Метод Симпсона&bsol;n"

<<"Выбранный метод - ";

cin>>numberMethod;

return numberMethod;

}

int selectedMethodFunction(FILE*f,int selectedZavisimost,int selectedOtnoshenie)

{

system("cls");

Zagolovok();

cout<<"Выбранная зависимость - "

<<selectedZavisimost

<<"&bsol;nВыбранный делитель - "

<<selectedOtnoshenie;

int selectedMethod=selectMethod();

while (selectedMethod!=1&&selectedMethod!=2)

{

cout<<"метод не найден, выберите снова...";

selectedMethod=selectMethod();

}

fprintf(f,"%s%d%s","Выбранный метод -",selectedMethod,"&bsol;t&bsol;n");

return selectedMethod;

}

int selectFunction()

{

int numberFunction;

cout<<"&bsol;nВыберите функцию:&bsol;n"

<<"1. f(x) = m/x^2&bsol;n"

<<"2. f(x) = m/x&bsol;n"

<<"3. f(x) = sin(mx)&bsol;n"

<<"Выбранная функция - ";

cin>>numberFunction;

return numberFunction;

}

int selectedFunctionFunction(FILE*f,int selectedZavisimost,int selectedOtnoshenie, int selectedMethod)

{

system("cls");

Zagolovok();

cout<<"Выбранная зависимость - "

<<selectedZavisimost

<<"&bsol;nВыбранный делитель - "

<<selectedOtnoshenie

<<"&bsol;nВыбранный метод -"

<<selectedMethod;

int selectedFunction=selectFunction();

while (selectedFunction!=1&&selectedFunction!=2&&selectedFunction!=3)

{

cout<<"Функция не найдена, выберите снова...";

selectedFunction=selectFunction();

}

fprintf(f,"%s%d%s","Выбранная функция -",selectedFunction,"&bsol;t&bsol;n");

return selectedFunction;

}

double selectedNizhPredel(FILE*f,int selectedZavisimost,int selectedOtnoshenie, int selectedMethod, int selectedFunction) //вводим нижний предел

{

system("cls");

Zagolovok();

cout<<"Выбранная зависимость - "

<<selectedZavisimost

<<"&bsol;nВыбранный делитель - "

<<selectedOtnoshenie

<<"&bsol;nВыбранный метод -"

<<selectedMethod

<<"&bsol;nВыбранная функция - "

<<selectedFunction;

double a;

cout<<"&bsol;nНижний предел интегрирования a=";

cin>>a;

fprintf(f,"%s%f%s","Нижний предел интегрирования a=",a,"&bsol;t&bsol;n");

return a;

}

double selectedVerhPredel(FILE*f) //и верхний

{

double b;

cout<<"Верхний предел интегрирования b=";

cin>>b;

fprintf(f,"%s%f%s","Верхний предел интегрирования b=",b,"&bsol;t&bsol;n");

return b;

}

double selectedKoefM(FILE*f)

{

double m; //ну и почти не нужный коэффициент (используем в нашей задаче только для синуса)

cout<<"Коэффициент m=";

cin>>m;

cout<<"&bsol;n&bsol;nИдет вычисление...&bsol;n в зависимости от параметров процесс может занять некоторое время&bsol;n";

fprintf(f,"%s%f%s","Коэффициент m=",m,"&bsol;t&bsol;n");

return m;

}

char uvelicVerhPredel()

{

char a;

cout<<"провести исследование при увелении верхнего предела?? Y???";

cin>>a;

return a;

}

void Zagolovok() //а это самая главная часть программы, без которой ничего работь не будет

{ //выводит на экран КУРСОВАЯ, для красоты, ну или для подобия красоты

cout<<"* * * * ** * * * * * * * * * * &bsol;n"

<<"* * * * * * * * * * * * * * * &bsol;n"

<<"** * ** * * * * * * * * * * &bsol;n"

<<"* * * * * * * * * * * * * * &bsol;n"

<<"* * * * * * * * * * * * * * &bsol;n"

<<"___________________________________________________ &bsol;n&bsol;n";

}