Aiutoooo, allora: sto facendo pratica con la libreria odeint di c++ per scrivere eq differenziali...
questa e' una prova in cui tento (nel file "prova_c.cpp") di passare i vettori dello stato ad un altro file "prova_e.h" in cui risolvo numericamente l'equazione e restituisco il vettore al.cpp per stampare i risultati.
nei 2 file uso librerie diverse perchè, nel grosso programma in cui usero' davvero l'equazione, ho scritto vettori e matrici con eigen mentre Odeint sembra lavori solo con std::vector.
questi sono i 2 codici:
prova_c.cpp
#include <stdio.h>
#include <iostream>
#include <Eigen/Dense>
#include <vector>
#include <home/acer/tut_eigen/prova_e.h>
using namespace std;
using namespace Eigen;
typedef std::vector< float > state_type;
Vector3f x(10.0,1.0,1.0);// initial conditions
Vector3f dxdt(sigma * ( x(1) - x(0) ),R * x(0) - x(1) - x(0) * x(2),-b * x(2) + x(0) * x(1));
int main(){
state_type g(x.size());
for (int i=0;i<=x.size()-1;i++){
g[i]=x(i);
}
state_type dgdt(dxdt.size());
for (int i=0;i<=dxdt.size()-1;i++){
dgdt[i]=dxdt(i);
}
vector<state_type> vec;
state_type tempi;
prova_e( tempi, vec, g, dgdt);
int w=tempi.size();
Eigen::VectorXf times(w);
for (int i=0;i<=tempi.size()-1;i++){
times(i)=tempi[i];
}
Eigen::Matrix<float,Dynamic, 3 > x_vec;
for (int i=0;i<=tempi.size()-1;i++){
x_vec(i,0)=vec[i][0];
x_vec(i,1)=vec[i][1];
x_vec(i,2)=vec[i][2];
}
/* output */
cout << times << '\t' << x_vec << '\n';
//]
return 0;
}
prova_e.h
#include <iostream>
#include <vector>
#include <home/acer/boost/numeric/odeint.hpp>
using namespace std;
using namespace boost::numeric::odeint;
typedef std::vector< float > state_type;
const float sigma = 10.0;
const float R = 28.0;
const float b = 8.0 / 3.0;
int pp=0;
void equation( const state_type &x , state_type &dxdt , double t )
{
dxdt[0] = sigma * ( x[1] - x[0] );
dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
dxdt[2] = -b * x[2] + x[0] * x[1];
}
void write_equation( const state_type &x , const float t )
{
vector<state_type> x_vec;
vector<float> times;
pp++;
times[pp]=t;
x_vec [pp][0]=x[0];
x_vec [pp][1]=x[1];
x_vec [pp][2]=x[2];
}
void prova_e( state_type& times, vector<state_type>& x_vec, state_type x, state_type dxdt)
{
void equation( const state_type &x , state_type &dxdt , double t );
integrate( equation , x , 0.0 , 25.0 , 0.1 , write_equation );
}
non so quanti errori ci siano....so solo che quando tento di compilare il terminale mi da:
Errore di segmentazione (core dump creato)
aiutatemi per favoreeeeee
grazie!