Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++] Calcolo radice quadra come limite di una serie

    Ciao, ho un esercizio che mi chiede di inserire la cardinalità dell'array e inserire successivamente i vari componenti, poi calcolare la somma e il prodotto dei componenti e mandarli in stampa a video...poi di calcolare la radice quadrata di ogni componente sia tramite l'operatore sqrt e sia come limite di una successione...
    io so che per calcolare una radice quadrata con questo metodo bisogna fare il limite per k che tende a infinito di Yk = (Yk-1 + X/Y(k-1))/2........però non so come farcelo entrare in un ciclo for :| sapete aiutarmi??

    vi posto il programma per come l'ho scritto fino ad ora...

    codice:
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    using namespace std;
    
    int main()
    {
        int n;  //variabile cardinalità vettore
        
        /*ATTENZIONE: inserire prima la cardinalità del vettore V e poi dichiararlo
        altrimenti il programma va in crash!*/
        cout<<"Inserire la cardinalita\' desiderata n per il vettore V: \n";
        cin>>n;
        
        int V[n];  //vettore di cardinalità n a scelta dell'utente
         
         int som, prod, i;   /*variabili di output per la somma e 
        il prodotto dei componenti di V, e i variabili algoritmo*/
           
       
        /*Istruzioni di richiesta dati per l'esecuzione del programma */
        
        cout<<"Inserire i "<<n<<" componenti del vettore V: \n";
        /*Inizio ciclo for per l'acquisizione dei componenti di V*/
        
        for(i=0;i<n;i++)
        {  cin>>V[i]; }       //fine ciclo for
        
        /*Inizializzazioni variabili per il conteggio e inizio ciclo for 
        per il calcolo della somma e del prodotto*/
        som=0;  prod=1;     
        
        for(i=0;i<n;i++)
        {   som= som + V[i];
            prod= prod*V[i];
        }
        //fine ciclo for
        cout<<"\n";
        cout<<"Le radici quadre dei rispettivi componenti di V sono: ";
        cout<<"\n \n \n";
        for(i=0;i<n;i++)
        {
           cout<<V[i]<<" -----> "<<sqrt(V[i])<<"\n";             
                        }
        
        /*Stampa dei risultati*/
        cout<<"\n \n \n";
        cout<<"La somma di "<<n<<" componenti del vettore V e\' uguale a: "<<som<<"\n";
        cout<<"Il prodotto di "<<n<<" componenti del vettore V e\' uguale a: "<<prod<<"\n";
        
        
        
        system("PAUSE");
        return 0;
    }

  2. #2
    Implementa la tua funzione mySqrt (o come la vuoi chiamare), calcolando al suo interno la radice quadrata come limite della serie; dal tuo for esterno poi chiamerai questa tua funzione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Io la funzione la implementerei con un do-While, in questo modo sei sicuro di aggiungere alla sommatoria il numero minimo di termini che ti servono per ottenere la precisione che vuoi, cosa impossibile con un for.
    Insomma farei una cosa del genere:
    codice:
    int n=0; //indicherà quante volte hai eseguito il ciclo, ti serve per calcolare l'elemento n-esimo
    float x; // termine generico della serie
    float  sum=0;
    const float precisione = 0.0001; //per esempio! Oppure lo fai inserire da tastiera
    do
    {
      x= //e te lo calcoli come funzione di n
      sum+= x;
      n++;
    }
    while (x>=precisione)
    return sum;
    Poi facci sapere come decidi di procedere
    Secondo me fare così piuttosto che un for ti evita un sacco di problemi in quanto se il numero di cui fare la radice fosse piccolo, ti basterebbero 2-3 termini della sommatoria, se invece fosse (che ne so) 10miliardi, servirebbero un sacco di termini in più, e tu non puoi saperlo a priori

  4. #4
    la radice come limite di funzione l'ho calcolata con un do-while però l'ho inserita all'interno di un for dato che si trattava di un vettore e quindi si doveva scorrere ogni elemento del vettore...non so se è fatto bene...però escono due risultati per ogni radice di componente se provate a vedere :| la somma, il prodotto e le radici calcolate con sqrt si trovano tutte...le radici calcolate con la funzione invece escono due risultati per ogni componente..

    codice:
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    using namespace std;
    
    int main()
    {
        int n;  //variabile cardinalità vettore
        
        /*ATTENZIONE: inserire prima la cardinalità del vettore V e poi dichiararlo
        altrimenti il programma va in crash!*/
        cout<<"Inserire la cardinalita\' desiderata n per il vettore V: \n";
        cin>>n;
        
        int V[n];  //vettore di cardinalità n a scelta dell'utente
         
         int som, prod, i;   /*variabili di output per la somma e 
        il prodotto dei componenti di V, e i variabili algoritmo*/
        double Y, E, Yprec; // variabili per il calcolo radice come limite
                              //di una successione
        E=0.1;  // dichiarazione errore
        /*Istruzioni di richiesta dati per l'esecuzione del programma */
        
        cout<<"Inserire i "<<n<<" componenti del vettore V: \n";
        /*Inizio ciclo for per l'acquisizione dei componenti di V*/
        
        for(i=0;i<n;i++)
        {  cin>>V[i]; }       //fine ciclo for
        
        /*Inizializzazioni variabili per il conteggio e inizio ciclo for 
        per il calcolo della somma e del prodotto*/
        som=0;  prod=1;     
        
        for(i=0;i<n;i++)
        {   som= som + V[i];
            prod= prod*V[i];
        }
        //fine ciclo for
        cout<<"\n";
        cout<<"Le radici quadre dei rispettivi componenti di V sono: ";
        cout<<"\n \n \n";
        
       
        for(i=0;i<n;i++)
        {  
           cout<<V[i]<<"\t"<<sqrt(V[i])<<"\n";             
                        }
        cout<<"\n \n";
        /*Calcolo radice tramite altro metodo*/
        Y=1;
     
     for(i=0;i<n;i++)
     {   do{
        
         Yprec=Y;
        Y=(Y+V[i]/Y)/2;
        cout<<V[i]<<" -----> "<<Y<<"\n";
    }while (fabs((Y-Yprec)/Y)>E);
    }
        /*Stampa dei risultati*/
        cout<<"\n \n \n";
        cout<<"La somma di "<<n<<" componenti del vettore V e\' uguale a: "<<som<<"\n";
        cout<<"Il prodotto di "<<n<<" componenti del vettore V e\' uguale a: "<<prod<<"\n";
        
        
        
        system("PAUSE");
        return 0;
    }

  5. #5
    Allora intanto, se proprio non vuoi usare una funzione, devi stampare FUORI dal while! Nel while tu calcoli la radice quadrata, quindi devi stampare nel for, per ogni vettore, il numero che hai calcolato nel while.
    codice:
    for(i=0;i<n;i++) {
      do{
           Yprec=Y;
           Y=(Y+V[i]/Y)/2;
           }
        while (fabs((Y-Yprec)/Y)>E);
    cout<<V[i]<<" -----> "<<Y<<"\n";
    }
    questo è perchè ti stampa più di un valore, perchè per ogni variabile tu stampavi tutte le iterazioni che facevi per calcolarla.
    Comunque c'è un problema su questa serie, che è evidentemente sbagliata! Sei sicuro di averla interpretata bene? Non so da tu l'abbia presa (era nel testo dell'esercizio? L'hai interpretata bene?) ma ho fatto un esempio calcolando a mano la radice di due con due iterazioni:
    il primo termine è 3/2 che fa 1.5 che è già maggiore di sqrt(2) (che fa 1.412), il secondo termine è 3/4+2/3, la somma totale fa 2.9, che è abbondandemente superiore al risultato che tu vuoi ottenere, in realtà ogni termine della serie dovrebbe diventare sempre (drasticamente) più piccolo, andando ad aggiungere precisione a ciò che hai calcolato, deve tendere DAL BASSO al risultato esatto, senza raggiungerlo mai: è per questo che ti avevo suggerito di fare il controllo del while sull'ultimo termine che vai ad aggiungere: quando vai ad aggiungere termini troppo piccoli esci dal while, ma io d'istinto avevo creduto che tu usassi lo sviluppo di taylor per sqrt(1+x)
    codice:
    //infatti avevo scritto
    float x //termine n-esimo della serie
    float risultato=0, errore=0.001;
    do{
    x=...
    risultato+=x;
    }
    while(x>=errore)
    cioè: aggiungi il termine x finchè questo non diventi più piccolo di errore.
    Il numero che tu calcolerai sarà sempre e comunque più piccolo di sqrt(x)!

    Se sei sicuro al 100% di aver interpretato al meglio la serie che devi usare allora credo che tu non debba proprio fare un while e fermarti solo al primo elemento, in quanto la serie non converge e qualsiasi altro termine va a sballarti completamente il risultato, se invece la serie devi sceglierla tu e non ti è stata imposta da nessuno puoi usare lo sviluppo di Taylor (lo trovi anche su wikipedia se cerchi radice quadrata) ed in quel caso ti consiglio di fare come appena spiegato

  6. #6
    no la serie che ho usata mi è stata imposta dal libro di testo datomi dal prof..cioè anche lui nei suoi appunti usa questa, io quello che non riuscivo a fare era come metterla in un ciclo for, alla fine ci son riuscito...però la funzione da usare per calcolare la radice è questa (purtroppo!)...non so se il prof ce l'ha data sbagliata o per quello che vuole lui gli va bene così...boh xD io so solo che questo era l'unico esercizio scocciante che dovevo usare la funzione per calcolarmi la radice.....altrimenti io uso sempre e solo sqrt() e faccio prima...per la stampa ho fatto come hai detto tu fuori dal while e va meglio..

    questa è la traccia che mi ha dato il prof:
    codice:
    Si scriva un programma che, assegnato in ingresso, ad un vettore V, un insieme
    di n valori interi, calcoli la somma som ed il prodotto prod degli elementi del
    vettore V e visualizzi quindi i valori di som e prod. Di ogni elemento del vettore,
    si calcoli inoltre la radice quadrata in due modi distinti: utilizzando la funzione
    di libreria sqrt e scrivendo esplicitamente le istruzioni per il calcolo della radice
    quadrata come limite di una successione, con precisione assegnata uguale a 0.1.
    Si produca quindi, sul supporto di uscita, una tabella che per ogni valore V[i]
    riporti i valori di sqrt(V[i]) e della radice di V[i] calcolata nel secondo modo.
    il secondo metodo sarebbe usare quel limite di successione che ho gia scritto....l'averlo messo in un ciclo do-while l'ho visto in un suo esempio identico...l'unica cosa che cambiava è che in quell'esempio non era un vettore v[i] ma un semplice numero e quindi non c'era bisogno di metterlo in un ciclo for...però il procedimento è uguale..

  7. #7
    guarda se è quella allora non fare proprio il while, altrimenti il risultato è sbagliato, inserisci solo il primo termine della serie. O magari chiedi direttamente delucidazioni al professore

    Comunque volevo farti notare (per il futuro) che è sbagliato mettere come condizione
    codice:
    fabs((Y-Yprecedente)/Y)>errore
    perchè tu y e yprecedente li sommi, quindi se per esempio:
    codice:
    y=2;
    yprecedente=2.000001;
    tu esci dal while ed ottieni come risultato 2, invece non devi uscire, perchè tu devi ottenere 4.
    Anche se 2 e 2.000001 sono molto simili, 4 non è simile a 2.
    Tu il controllo lo devi fare su y: cioè se y è troppo piccolo, allora tu vai a sommare un numero piccolo, del quale magari non ti interessa niente: allora in quel caso esci dal while.
    codice:
    yprecedente = 1.01;
    y=0.0000000001;
    è questo il caso in cui tu smetti di sommare.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.