c ++在ode中的对象之间的gsl交互

时间:2014-08-05 03:28:58

标签: c++ object gsl interaction ode

请你帮我解决我的问题。我正在尝试编写一个程序,其中不同类中的对象进行交互。我将我的模型基于gsl库来解析我的常微分方程(ode)。

不同阶级的实例相互消耗,因此当他们吃或被吃掉时,他们会得到或者松散。

我的2颂歌就像b [i] =消费总和 - 消费总和。 我计算消费量如下,其中1为消费者,0为猎物。     conso [1] = y [0] * x [1] * y [1]

原始代码来自"示例代码使用gsl例程"如下修改。 A类和B类的实例包含在C类地图中。

我是c ++的新手,我不知道如何在ode中集成循环以使其计算每个实例所消耗的内容,并将其从已经过的其他实例中删除吃过。最好的方法是使用istances类中的函数和变量,但是ode必须是静态的函数。我想到了数组,但似乎数组不能成为颂歌的参数。

另一个问题是,对于每个实例,参数必须更改并在类中进行,但是我在这里做了,在使用迭代器的循环中,ode将适用于最后一个实例...再次我我想使用C类数组来获取A类和B类实例的参数,但由于该函数是静态的,我不能使用类的数组" C"。我遇到了麻烦! 你有什么想法 ?谢谢!

// include files
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

#include <gsl/gsl_errno.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_odeiv.h>

// ************************* C.h ****************************

class C
{
public :
C(std::map(std::map<std::string,A> &A, std::map<std::string,B> &B);
~C();
int integ(void);
int static rhs (double t, const double y[], double f[], void *params_ptr);

private :
std::map<std::string,A> &A,
std::map<std::string,B> &B,

};

//*************************** C.cpp ****************************

int C::integ (void)
{
int dimension = 2;      // number of differential equations

double eps_abs = 1.e-8; // absolute error requested
double eps_rel = 1.e-10;    // relative error requested

// define the type of routine for making steps:
const gsl_odeiv_step_type *type_ptr = gsl_odeiv_step_rkf45;

// allocate/initialize the stepper, the control function, and the
//  evolution function.

gsl_odeiv_step *step_ptr = gsl_odeiv_step_alloc (type_ptr, dimension);
gsl_odeiv_control *control_ptr = gsl_odeiv_control_y_new (eps_abs, eps_rel);
gsl_odeiv_evolve *evolve_ptr = gsl_odeiv_evolve_alloc (dimension);

gsl_odeiv_system my_system; // structure with the rhs function, etc.

// parameter for the diffeq

    for(itA=A.begin(); itA!=A.end(); ++itA)
{
x = itA->second.getx();
my_system.params = &x;  // parameters to pass to rhs
}
for(itB=B.begin(); itB!=B.end(); ++itB)
{
z = itB->second.getz();
my_system.params = &z;  // parameters to pass to rhs
}


double y[2];            // current solution vector

double t, t_next;       // current and next independent variable
double tmin, tmax, delta_t; // range of t and step size for output

double h = 1e-6;        // starting step size for ode solver

// load values into the my_system structure
my_system.function = rhs;   // the right-hand-side functions dy[i]/dt
my_system.dimension = dimension;    // number of diffeq's


tmin = 0.;          // starting t value
tmax = 100.;            // final t value
delta_t = 1.;

for(itA=A.begin(); itA!=A.end(); ++itA)
{
y[0] = itA->second.getY();          // initial y value
}
for(itB=B.begin(); itB!=B.end(); ++itB)
{
y[1] = itB->second.getY();          // initial y value
}


t = tmin;           // initialize t

// print initial values
cout << scientific << setprecision (5) << setw (12) << t << " "
<< setw (12) << y[0] << " " << setw (12) << y[1] << endl;

// step to tmax from tmin
for (t_next = tmin + delta_t; t_next <= tmax; t_next += delta_t)
{
    while (t < t_next)  // evolve from t to t_next
    {
        gsl_odeiv_evolve_apply (evolve_ptr, control_ptr, step_ptr,
                                &my_system, &t, t_next, &h, y);
    }

    // print at t = t_next
    cout << scientific << setprecision (5) << setw (12) << t << " "
    << setw (12) << y[0] << " " << setw (12) << y[1] << endl;
}

// all done; free up the gsl_odeiv stuff
gsl_odeiv_evolve_free (evolve_ptr);
gsl_odeiv_control_free (control_ptr);
gsl_odeiv_step_free (step_ptr);

return 0;
}

//*************************** rhs ****************************

int C :: rhs (double , const double y[], double f[], void *params_ptr)
{
// get parameter(s) from params_ptr; here, just a double
double x = *(double *) params_ptr;
double z = *(double *) params_ptr;

// evaluate the right-hand-side functions at t
f[1] = x * y[1] + sum consumption - sum consumed;     //objects of class A
f[0] = - z * y[0] - sum consumed;   //objects of class B

return GSL_SUCCESS;     // GSL_SUCCESS defined in gsl/errno.h as 0
}

我尝试添加消费,但它说&#34;错误:&#39;无效&#39;必须是第一个也是唯一的参数if       指定&#34; :

int C :: rhs (double , const double y[], double f[], void *params_ptr, void conso)
{
// get parameter(s) from params_ptr; here, just a double
double x = *(double *) params_ptr;
double z = *(double *) params_ptr;

// evaluate the right-hand-side functions at t
f[0] = z * y[0];     //objects of class A
f[1] = - x * y[1] + conso;   //objects of class B

return GSL_SUCCESS;     // GSL_SUCCESS defined in gsl/errno.h as 0
}

//***And in int C :: integ :

for(itA=A.begin(); itA!=A.end(); ++itA)
{
    for(itB=B.begin(); itB!=B.end(); ++itB)
    {
        void conso = itA->second.conso(itB->second, x);
    }
}

//***With in class A : 

void A :: conso(Group &prey, double x)
{
  double conso=0;
  conso = x * y * prey.gety();
}

0 个答案:

没有答案