Dev C++ Решение дифференциального уравнение первого порядка методом Рунге-Кутты 4-го порядка
программа использует контейнер map из std не самый лучший вариант
программа демонстрирует некоторые приемы работы с контейнером map
пример использования указателя на функцию
=
=
#include <math.h>
#include <iostream>
#include <map>
#include <iomanip>
using namespace std;
//--------------------------------------------------
typedef map <double, double> TmyMap;//TmyMap- это просто псевдоним (другое имя) для уже существующего типа заменяет: map <double, double>
//-----------------------------------------------------
static double F(double x, double y)//функции для интегрирования
{
return 1 / ( x * x + y * y + 2) ;
}
//-----------------------------------------------------
static double F1(double x, double y)
{
return 3 * sin( 2 * y ) + x;
}
//-------------------------------------------------------------------------------
static double F2(double x, double y)
{
return ((2*x-5)/(x*x))*y+5;
}
//-------------------------------------------------------------------------------
static void metodRK(
double x,//начало интегрирования
double xn, //конец интегрирования
double y, //значение Y в точке X
double h,//шаг интегрирования
//map <double, double> (*m),// если не было бы TmyMap
TmyMap (*m),//указатель на контейнер map сюда пишем результат
double (*FF)(double x, double y) //указатель на интегрируемую функцию
)
{
int n = static_cast<int>((xn - x) / h);//статическое приведение типа double к int
(*m)[x] = y;//разименовываем указатель на *m получаем объект m добовляем ключ X со значением Y. Первый элемент
for (int i = 0; i < n; i++)
{
double k1 = h*FF(x, y);
double k2 = h*FF(x + h / 2.0, y + k1 / 2.0);
double k3 = h*FF(x + h / 2.0, y + k2 / 2.0);
double k4 = h*FF(x + h, y + k3);
y += (k1 + 2 * k2 + 2 * k3 + k4) / 6.0;
x += h;
// m->insert ( TmyMap::value_type(x,y) );//можно добовлять элементы и так
// m->insert ( pair<double,double>(x,y) );//можно добовлять элементы и так
(*m)[x] = y;//разименовываем указатель на *m получаем объект m добовляем ключ X со значением Y. последующие элементы
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
///программа использует контейнер map из std не самый лучший вариант
///программа демонстрирует некоторые приемы работы с контейнером map
///пример использования указателя на функцию
///////////////////////////////////////////////////////////////////////////////////////////
int main(int argc, char** argv) {
setlocale (LC_ALL, "Russian");
cout << "Решение дифференциального уравнение первого порядка методом Рунге-Кутты 4-го порядка"<< endl;
// map <double, double> Map;
TmyMap Map; //объявляем контейнер TmyMap с именем Map
// map <double, double> ::iterator it ;
TmyMap::iterator it ;//объявляем итератор с именем it
double (*pFf)(double x, double y);//объявляем указатель *pFf на функцию для выбора нужной функции
char d;//для меню
double x = 0.0;//начало
double xn = 0.0;//конец
double y = 0.0;//значение в точке х
double h = 0.0;//шаг
kt :
//меню
cout << "1- уровнение 1/(x*x+y*y+2);"<< endl;
cout << "2- уровнение 3*sin(2*y)+x;"<< endl;
cout << "3- уровнение ((2*x-5)/(x*x))*y+5;"<< endl;
cout << "4- выход "<< endl;
cout << "введите: " ; cin >> d;
cout << endl;
cout << endl;
if(d > '4'||d < '1' )
{
cout << "правильно выберите пункт меню и введите число ";
cout << endl;
goto kt;//переход на метку kt: если не выбран один из предложанных пунктов
}
if(d == '1'){ pFf = F; x = 0; xn = 0.3; y = 0; h = 0.01; } // указателю на функцию pFf передаем имя функции F (имя функции это указатель)
if(d == '2'){ pFf = F1; x = 0; xn = 0.3; y = 0; h = 0.01; }//атакже определяем значения пременных по умолчанию
if(d == '3'){ pFf = F2; x = 1; xn = 3; y = 2; h = 0.2; }
if(d == '4') return 0;
//можно добавить ввод перемен в ручную
//cout << "введите начальную точку X"; cin >> x; << endl;
//cout << "введите конечную точку Xn"; cin >> xn; << endl;
//cout << "введите начальную точку Y"; cin >> y; << endl;
//cout << "введите шаг H"; cin >> h; << endl;
metodRK( x, xn, y, h, &Map, pFf );
//вывод map на экран
cout << std::setprecision(10); //количество символов после запятой
cout << "=========РЕШЕНИЕ========================================================"<< endl;
it = Map.begin();//начало контейнера
while (it != Map.end())//конец контейнера
{
cout <<"x = " << (*it).first/*ключ */ << " : " << ", y = " << (*it).second/*значение*/ << endl;
++it;//перемещаем итератор
}
cout << "========================================================================"<< endl;
cout << "хотите продолжить да-1 нет-0: "; cin >> d;
cout << endl;
if(d =='1') goto kt;//переход на метку kt:
// cin.get();
// cin.get();
return 0;
}
=
=
=
|