Integrazione Numerica, da Fortran a c++

di
Anonimizzato7156
il
3 risposte

Integrazione Numerica, da Fortran a c++

Salve
sto svolgendo un compito riguardante l'integrazione numerica; il professore ci ha dato una traccia di cosa fare, ma in Fortran, sta a noi "tradurre" il tutto in c++:
ecco la traccia

      PROGRAM intBox
      IMPLICIT NONE
C
      INTEGER i, maxDivis 
      INTEGER nint 
      REAL a, b, dx 
      REAL int, int_old 
      REAL box
C
      a = 0. 
      b = 1. 
      maxDivis = 20
C
      int_old = box( a, b, 1, nint, dx) 
      DO i = 2, maxDivis
           int = box( a, b, i, nint, dx) 
           WRITE(*,100) i, nint, dx, int, (int-int_old)/int 
           int_old = int
      END DO
      STOP 
100 FORMAT (I4,I10,3E15.7)
      END
C
      REAL FUNCTION box( a, b, n, numint, h)
      IMPLICIT NONE
C
      INTEGER n 
      REAL a, b 
      REAL func 
C 
      INTEGER numint
      REAL h
C
      INTEGER i 
      REAL sum
C
      numint = 2**n
      h = (b-a)/numint 
      sum = func( a) 
      DO i = 1, numint-1
         sum = sum + func(a + i*h) 
      END DO
      box = sum * h 
      RETURN 
      END
C
      REAL FUNCTION func( x)
      IMPLICIT NONE 
      REAL x 
      func = x**3 
      RETURN
      END
Quindi: nint è il numero di intervalli, int e int_old in c++ li ho chiamati integr e integr_old, a b sono gli estremi di integrazione e dx è la lunghezza dell'intervallo di integrazione (in fortran nella funzione box è h)
Considerando di integrare una funzione costante 1 (quindi func=1), ho ottenuto questo

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <cmath> 

using namespace std;

typedef float DP;

DP box (int i, int nint, int n,  DP a, DP b, DP dx);
DP func (DP x);

int main ()
{
	int i, maxDivis, nint;
	DP a, b, dx;
	DP integr, integr_old;
	DP box (int i, int nint, DP a, DP b, DP dx);

	a=0;
	b=1;
	maxDivis=20;
	
	integr_old = box (a, b, 1, nint, dx);
	for (i=2; i=maxDivis; i++);
	integr= box (a, b, i, nint, dx);
	cout << setw(8)<<"i= "<< setw(8) <<"nint= "<<setw(8) <<"dx= " <<setw(8) <<"intervallo= "<<setw(8) <<"Differenza = "<< endl;
	cout << setw(8)<<i << setw(8) <<nint<<setw(8) <<dx <<setw(8) <<integr <<setw(8) <<(integr-integr_old)/integr <<endl;
	return 0;

}
DP box (int i, int nint, int n,  DP a, DP b, DP dx)
{	
	DP sum;
	for (int k=1; k<=n; k++);
	{nint=nint*2;}
	dx = (b-a)/nint;
	sum = func (a);
	for (int g=1; nint-1; g++){
					sum=sum+func (a+i*dx);
				}
	return (sum*dx);
}

DP func (DP x)
{
	return (1);
}
Usando il compilatore su Macintosh (SL), ottengo questo errore nel terminale:
Undefined symbols:
  "box(int, int, float, float, float)", referenced from:
      _main in ccuo0eXE.o
      _main in ccuo0eXE.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Siccome non capisco il messaggio di errore, qualcuno può dirmi cosa ho sbagliato? grazie mille a tutti

3 Risposte

  • Re: Integrazione Numerica, da Fortran a c++

    Il linker non trova i simboli per:
    box (int,int,float,float,float) ... infatti tu hai definito :
    box (int,int,int,float,float,float)


    Saluti,
    Max
  • Re: Integrazione Numerica, da Fortran a c++

    Ok
    però ho provato quindi a dichiarare nella funzione main
    box (int,int,int,float,float,float)
    come fuori dalla funzione e nella dichiarazione in basso;
    però il compilatore mi da un altro errore:
    integrazionenumerica.cpp:26: error: too few arguments to function ‘DP box(int, int, int, DP, DP, DP)’
    integrazionenumerica.cpp:32: error: at this point in file
    integrazionenumerica.cpp:26: error: too few arguments to function ‘DP box(int, int, int, DP, DP, DP)’
    integrazionenumerica.cpp:34: error: at this point in file
  • Re: Integrazione Numerica, da Fortran a c++

    Anche non conoscendo il Fortran vedo che la trascrizione è differente.
    Nella forma originale la funzione box prevede (float,float,int,int,float) - 3 float 2 int
    Nella trascrizione ordinata mi trovo (int,int,int,float,float,float) - 3 float 3 int
    Sempre nel codice C vedo le due chiamate a box che passano in parametri in altra forma e precisamente (float,float,int,int,float) - 3 float 2 int
    E ancora incongruenze da verificare:
    
    FORTRAN:
         ...
          DO i = 1, numint-1
             sum = sum + func(a + i*h) 
          END DO
         ...
    C: 
         ...
       for (int g=1; nint-1; g++){
                   sum=sum+func (a+i*dx);
                }
         ...
    
    
    Dove func (a + i*h) dovrebbe essere (a + g*h)

    Un consiglio che ti do per debuggare è spostare le funzioni 'func' e 'box' prima del main, remmare i prototype e modificare i parametri chiamata/ricezione.

    Saluti,
    Max
Devi accedere o registrarti per scrivere nel forum
3 risposte