I file di testo sui quali lavoro sono:
runge_kutta.C
Codice: Seleziona tutto
#include<iostream>
#include<cmath>
#include <passe_par_tout.h>
#include <iomanip>
#include "funzioni.h"
using namespace std;
double* (*pf)(double *, double ,int );
extern void menu(int, int) ;
int main()
{
double *x, *xh, *y, *yh, *z, *zh, *w, *wh, t=0, h, norma,normaf;
extern int n;
extern int pc;
n=n_;
pc=pc_;
cout << "Questo programma risolve un set di equazioni differenziali predefinite.\n";
cout << " Digitare:\n (1) Per l'attrattore di Lorentz;\n (2) Per l'oscillatore armonico;\n (3) Per il metodo preda-predatore.\n";
cin >> pc;
menu(pc,n);
x = new double[n];
xh = new double[n];
y = new double[n];
yh = new double[n];
z = new double[n];
zh = new double[n];
w = new double[n];
wh = new double[n];
cout << "Digitare le "<< n <<" componenti del vettore X.\n";
for(int i=0; i<n; ++i)
cin >> x[i];
norma=(x[0] * x[0]) + ( x[1] * x[1]);
cout << "Digitare il parametro di precisione nell'approssimazione della derivata (Consigliato 0.0005) " << endl;
cin >> h;
//int K = 600, L = 600;
//double q[]={(-2*x[0]),-3*x[1],20*x[0],3*x[1]};
//m_startg(const_cast<char*>(" RUNGE KUTTA"), &K, &L);
//K = L = 95;
//m_window(&K, &L); // vengono dati alla funzione window i valori precedentemente assegnati a K e L
//m_use_as_pixmap(&(K=1), &(L=NERO));//questa stringa fa in modo che il grafico venga disegnato come pixmap cioè prima il programma ottiene tutti i dati e poi screnna il grafico tutto in una volta
//m_frame(q, q+1, q+2, q+3);// Stabilisce le scale
//m_color(&(K=VERDE));
//m_symbol(&(K=PUNTONE));
int m;
cout << "Inserire il numero di cicli che vuoi che il programma svolga.\n";
cin >> m;
pf(double *x, double t,int n);
for(int j=0; j<m; ++j)
{
for(int i=0; i<n; ++i)
xh[i]=x[i];
(*pf)(xh, t, n);
for(int i=0; i<n; ++i)
y[i]=x[i]+(h/2)*xh[i];
for(int i=0; i<n; ++i)
yh[i]=y[i];
(*pf)(yh, t+(h/2), n);
for(int i=0; i<n; ++i)
z[i]=x[i]+(h/2)*yh[i];
for(int i=0; i<n; ++i)
zh[i]=z[i];
(*pf)(zh, t+(h/2), n);
for(int i=0;i<n;++i)
w[i]=x[i]+(h*zh[i]);
for(int i=0;i<n;++i)
wh[i]=w[i];
(*pf)(wh, t+h, n);
for(int i=0; i<n; ++i)
{
x[i]=x[i]+(h/6)*(xh[i]+2*yh[i]+2*zh[i]+wh[i]);
cout << x[i] << " ";}
//q[0] = t, q[1] = x[1];//, m_point(q), //m_redraw(&(K=0)),
t=t+h;
cout << endl;
}
normaf=(x[0] * x[0]) + ( x[1] * x[1]); // Va inserita alla fine del ciclo. <-----------------------
cout << "L'energia iniziale è: " << norma << "." << endl;
cout << "L'energia finale è: " << normaf << "." << endl;
//m_wait_for_events(&(K=EVENTO_ENTER));
//m_endg();// le ultime due stringhe sono per far in modo che il programma si chiuda premendo enter
}
Codice: Seleziona tutto
#ifndef FUNZIONI_H
#define FUNZIONI_H
using namespace std;
extern double* (*pf)(double *x, double t,int n); // Puntatore a funzione, vuole la parentesi intorno il nome
extern int n_;
extern int pc_;
double *oscillatore(double *x, double t,int n)
{
double v;
v=x[0];
x[0]=x[1];
x[1]=(-v);
}
double *lorentz(double *x,double t, int n)
{
double *x_[3];
x_[0]=10*(x[1]-x[0]);
x_[1]=28*x[0]-x[1]-x[0]*x[2];
x_[2]=x[0]*x[1]-8/3*x[2];
}
double *preda(double *x,double t, int n)
{
double a=1,b=0.2-(n-2)*0.001,c=0.04,p=0.5;
double z_[2];
z_[0]=(a-b*x[1])*x[0];
z_[1]=(c*x[0]-p)*x[1];
}
extern void menu ( int , int )
{
switch (pc_){
case 1:{pf=lorentz;
n_=3;}
case 2:{pf=oscillatore;
n_=2;}
case 3:{pf=preda;
n_=2;
}
}
#endifChiedo anticipatamente scusa per le altri possibile " eresie" presenti nel codice, ma la mia poca esperienza è ancora molto influente!
NB. Le righe commentate riguardano un'implementazione grafica, ma al momento non serve.
