Суббота, 04.05.2024, 04:08
Главная Регистрация RSS
Приветствую Вас, Гость
Меню сайта
Категории раздела
Форма входа
ДРУЗЬЯ САЙТА

Вызвать мастера в Красноярске

8 983 207 5474

8 902 918 9334

8 933 332 3164

---------------------------------

Запчасти бытткхники

  • Велес т.2935600
  • СЦ Близнецов т.2296595
  • Вираж
  • Красраб 110 т.2589503
  • Комплекстур Щорса30 т.2606797
  • Радиодетали

  • Якорный 9 т.2688317
  • Воронова 16 т.2202990
  • Красраб 125а т.2456544
  • Профи т.2702737
  • Дайте две т.+79237713323
  • Электрика

  • Электро +
  • Планета электрика
  • ЗАКЛАДКИ
    Поиск
    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Главная » Статьи » Dev C++ » Простые примеры

    Dev C++ Решение дифференциального уравнение первого порядка методом Рунге-Кутты 4-го порядка

    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;
    }

    =

    =

    =

    Категория: Простые примеры | Добавил: doka (06.12.2020)
    Просмотров: 2009 | Рейтинг: 0.0/0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]