使用C ++中的Runge-Kutta算法求解二阶ODE

时间:2016-12-20 16:48:57

标签: c++ algorithm gsl

我正在使用C ++对火箭运动进行建模,我正在解决以下微分方程:

Second order ODE

我想用Runge-Kutta来解决这个问题,为此我将使用gsl例程。首先,我需要将其分解为两个一阶ODE,结果是:

First order ODEs

其中tau是唯一的变量(在这种情况下U = 1)。请注意,tau = t / tb(这很重要,因为我在代码中输入t / tb)! 所以我将使用Runge-Kutta 4算法,问题是,我认为在将这两个方程式转换为矢量形式到代码中时我犯了一个错误。如果有人能够发现我做错了什么,我会永远感激。

#include <stdio.h>
#include <gsl/gsl_erno.h>
#include <gsl/gsl_matrix.h>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cmath>

const double tg = 804.9;
const double tc = 10000;
const double g = 9.829;
const double U = 1;
const double r0 = 0.6368*pow(10,7);
const double tb = 200;

int func(double t, const double y[], double f[], void *params)
{
  f[0] = y[1];
  f[1] = tb*tb/(tg*tg)*(tc*U/(tb*(1-t/tb)) - 1);
  return GSL_SUCCESS:
}

int main (void);
{
  double A;

  printf( "%s\n", "Please enter the desired step size" );
  std::cin >> A;


  gsl_odeiv2_system = {func, 0, 2, &mu};


  gsl_odeiv2_driver *d = gsl_odeiv2_driver_alloc_y_new (&sys,gsl_odeiv2_step_rk4, 1e-3, 1e-8, 1e-8);

  double t = 0.0;
  double y[2] = {r0, 0.0};
  printf( "%f $10f\n", y[0], y[1] );
  int i, s;

  printf( "%s %22s %22s\n", "Time", "x(t)", "v(t)" );

  for (i = 0; i <= tb; i++)
  {
    printf( "%.15f %22.15f %22.15f\n", t/tb, y[0]/r0, y[1]*tb/r0 );

    s = gsl_odeiv2_driver_apply_fixed_step (d, &t, A, 1/A, y);

  }
  gsl_odeiv2_driver_free (d);

return 0;
}

我发布了我的整个代码以防万一。请记住,我的代码实际上是t / tb但t / tb = tau。所有的常量使它看起来令人困惑和混乱,但我认为我已经错误的一点是函数'func'。所以我想我的问题是;通过查看我上传的第一个订单ODE,我是否正确地将它们输入到我的代码中?非常感谢你提前。

0 个答案:

没有答案