Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    55

    Programma in C: Calcolo di un integrale

    ciao a tutti ragazzi... ho trovato in rete questo interessante programma in c sul calcolo di un integrale...



    Questo programma illustra il funzionamento dei principali metodi numerici di integrazione : metodo dei rettangoli, dei trapezi, simpson e montecarlo. La funzione “funzione” viene integrata nell’intervallo [A,B] (modificabile tramite #define) con precisione scelta (sempre modificabile nel #define).

    /********************
    *
    * Il programma restituisce l’integrale di una funzione in un
    * intervallo scelto calcolato con diversi metodi di integrazione
    *
    * Autore : snoomerz
    * (Web: http://snoomerz.netsons.org)
    *
    * Rilasciato con licenza Creative Commons Attribuzione 2.5 Italia
    * (http://creativecommons.org/licenses/by/2.5/it/)
    *
    *********************/

    #include <math.h>

    #define A 1 /* Estremi dell’intervallo */
    #define B 2 /* di integrazione */

    #define N_INT 10000 /* Numero di suddivisioni intervallo per metodi dei rettangoli, dei trapezi, simpson */
    #define N_MNT 100000 /* Numero suddivisioni intervallo per metodo Montecarlo */

    #define SEED 987654321

    double funzione(double x);
    double rettangoli(double(*fp)(double), double a, double b, int n_int);
    double trapezi(double(*fp)(double), double a, double b, int n_int);
    double simpson(double(*fp)(double), double a, double b, int n_int);
    double montecarlo(double(*fp)(double), double a, double b, int n_mnt);

    int main(void){
    printf(”\nL’ integrale della funzione vale :\n\n”);
    printf(”Metodo dei rettangoli: %f\n”, rettangoli(funzione, A, B, N_INT));
    printf(”Metodo dei trapezi : %f\n”, trapezi(funzione, A, B, N_INT));
    printf(”Metodo simpson : %f\n”, simpson(funzione, A, B, N_INT));
    printf(”Metodo montecarlo : %f\n\n”, montecarlo(funzione, A, B, N_MNT));
    return 0;
    }

    double funzione(double x){
    return exp(x)+log(x); /* Funzione da integrare */
    }

    double rettangoli(double(*fp)(double), double a, double b, int n_int){
    double h=0, value=0, i=0;
    h=(b-a)/n_int;
    for(i=a;i<b;i+=h) value+=h*(*fp)(i+h/2);
    return value;
    }

    double trapezi(double(*fp)(double), double a, double b, int n_int){
    double h=0, value=0, i=0;
    h=(b-a)/n_int;
    for(i=a;i<b;i+=h) value+=(((*fp)(i)+(*fp)(i+h))*h/2);
    return value ;
    }

    double montecarlo(double(*fp)(double), double a, double b, int n_mnt){
    double value=0, i=0;
    srand(SEED);
    for(i=0;i<n_mnt;i++) value+=((b-a)/n_mnt)*(*fp)((b-a)*(double)rand()/RAND_MAX + a); /* (b-a)*(double)rand()/RAND_MAX + a restituisce un valore casuale compreso fra a e b*/
    return value;
    }

    double simpson(double(*fp)(double), double a, double b, int n_int){
    double h=0, i=0, par=0, dis=0;
    int j=0;
    if ( n_int % 2 ) ++n_int;
    h=(b-a)/n_int;
    for(i=a+h;i<b;i+=h){
    if(j%2==0) par+=(*fp)(i);
    else dis+=(*fp)(i);
    j++;
    }
    return h* ((*fp)(a)/3 + 4*par/3 + 2*dis/3 + (*fp)(b)/3);
    }


    io studio c# e mi risulta un po' difficile un paio di cose...


    1)cosa significa questo *fp che ricorre spesso?
    tipo qui: double(*fp)(double)

    2)e questa riga di codice?


    per il resto l'ho capito tutto perchè apparte quelle due righe è simile al c#...

    grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,327

    Re: Programma in C: Calcolo di un integrale

    Originariamente inviato da monitor
    1)cosa significa questo *fp che ricorre spesso?
    tipo qui: double(*fp)(double)
    indica un parametro di tipo "puntatore a funzione con un parametro double e che restituisce un valore double". Se studi il C#, puoi vedere i puntatori a funzioni come qualcosa di concettualmente simile ai delegati, anche se qui parliamo di funzioni e non di metodi.
    In realtà in quel caso è quasi inutile il ricorso a puntatori a funzione perché potrebbe essere richiamata direttamente la funzione da integrare senza puntatore, visto che è definita all'interno del programma... per intenderci, la funzione "rettangoli" ad esempio potrebbe essere ridefinita semplicemente come

    prototipo:
    codice:
    double rettangoli(double a, double b, int n_int);
    definizione:
    codice:
    double rettangoli(double a, double b, int n_int)
    {
      double h=0, value=0, i=0;
      h=(b-a)/n_int;
      for(i=a;i<b;i+=h) value+=h*funzione(i+h/2);
      return value;
    }
    chiamata da main():
    codice:
    rettangoli(A, B, N_INT);
    e in maniera simile per tutte le altre.

    I puntatori a funzione in quel caso avrebbero senso se si trattasse di una libreria generica di metodi di integrazione, ma vabbè questo non importa.

    2)e questa riga di codice?
    quale riga?
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    55
    ottimo grazie! ora è più chiaro... anzi.. è tutto chiaro..! l'altra riga di codice non l'ho più messa...

    è questa...:

    #define SEED 987654321

    poi usa questo più volte...
    per esempio qui..

    double montecarlo(double(*fp)(double), double a, double b, int n_mnt){
    double value=0, i=0;
    srand(SEED);
    for(i=0;i<n_mnt;i++) value+=((b-a)/n_mnt)*(*fp)((b-a)*(double)rand()/RAND_MAX + a); /* (b-a)*(double)rand()/RAND_MAX + a restituisce un valore casuale compreso fra a e b*/
    return value;
    }

    grazie ancora!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,327
    La define è una direttiva al precompilatore e serve a definire (in quel caso) una "costante simbolica", praticamente per migliorare la leggibilità (ma anche la scrittura) del codice associ al numero 987654321 un alias che è appunto "SEED", quindi quando lo vai ad utilizzare qui

    codice:
    srand(SEED);
    di fatto è come se stessi scrivendo

    codice:
    srand(987654321);
    anzi, per essere più precisi il codice che poi viene compilato davvero contiene proprio questa seconda istruzione, che sostituisce la prima appunto quando entra in funzione il precompilatore che va a sostituire tutte le occorrenze di SEED con il valore numerico associato. In realtà la #define può avere anche altre utilità, ma in quel caso non c'è niente di diverso da quello che ti ho detto.

    Sul significato del valore, "seed" significa "seme", si riferisce al "seme di inizializzazione" del generatore di numeri pseudo-casuali che in C si assegna proprio con la funzione srand(). Chiaramente avresti potuto specificare qualsiasi altro nome invece di SEED, quello che conta è l'uso che ne fai (oltre al fatto di dargli comunque un nome significativo per motivi di logica).
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    55
    ma quest'ultima cosa sarebbe un normale random..? non mi è molto chiara..

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,327
    Originariamente inviato da monitor
    ma quest'ultima cosa sarebbe un normale random..? non mi è molto chiara..
    srand() serve solo a inizializzare il seme del generatore di numeri pseudo-casuali, cioè il valore in base al quale viene poi definita la sequenza di numeri generata. La funzione che poi genera effettivamente questi valori è rand() e viene richiamata nella riga successiva

    codice:
    for(i=0;i<n_mnt;i++) value+=((b-a)/n_mnt)*(*fp)((b-a)*(double)rand()/RAND_MAX + a);
    tutto quel casino attorno serve a generare valori in un certo range (perché la rand() di suo genera valori nell'intervallo [0,RAND_MAX]) ma per maggiori dettagli ti consiglio di leggere qualche risorsa su come utilizzarla perché spiegare dettagliatamente è impossibile
    every day above ground is a good one

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    55
    adesso ci sono.. è che non ho mai usato il c puro e su queste piccole cose
    magari mi blocco... comunque grazie ancora... adesso ci sono!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.