Почему rk4.do_step не выводит начальное условие на C ++? - PullRequest
0 голосов
/ 13 июля 2020
• 1000 Связано ли это с моим образцом для l oop?

:

int main(int argc, char** argv)
{
    state_type x = { 0, 895.1170, 16000, 0 }; // initial conditions
    double t = 0.0;
    double t1 = 10;
    double dt = 1;
    size_t nSteps = 1000;

    //integrate(odeFunc, x, t, t1, dt, my_observer);

    runge_kutta4<state_type>rk4;
    ofstream myfile("data.txt");
    if (myfile.is_open()){
        for (int i = 0; i < 19; ++i) {
        
            t += dt;
            rk4.do_step(odeFunc, x, t, dt);

            myfile << t << "   " << x[2] << endl;
        }
    }

}

, в результате чего:

1   16001
2   16005.4
3   16015
4   16032
5   16058.5
6   16096.5
7   16148.4
8   16216.4
.
.
.

Но я бы хотел бы иметь

1   16000
2   16001
3   16005.4

1 Ответ

0 голосов
/ 13 июля 2020

Я решил свою проблему, используя функцию integration_const, а также функцию наблюдателя. Я использовал stati c ofstream, чтобы мой файл оставался открытым и не перезаписывался на каждой итерации.

void my_observer(const state_type& x, const double t)
{
    static ofstream data("data.txt");
    data << t << "   " << x[2] << std::endl;
}

int main(int argc, char** argv)
{
    state_type x = { 0, 895.1170, 16000, 0 }; // initial conditions
    double t = 0.0;
    double t1 = 19;
    double dt = 1;


    integrate_const(runge_kutta4<state_type>(), odeFunc, x, t, t1, dt, my_observer);}
...