Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Teorema di Ruffini

  1. #1

    Teorema di Ruffini

    Ho bisogno d'aiuto con un Javascript che esegue la scoposizione di un equazione di 3° grado mediante la Regola di Ruffini.
    Non sò di preciso in cosa risieda il problema

    Se potete aiutarmi, sai molto contento

    codice:
    <html>
    <head>
    <style>table{text-align:center;border-collapse:collapse}
    #l1{border-left:2px solid black}#l2{border-top:2px solid black}
    #l3{border:2px solid black;border-right:0px;border-bottom:0px}</style>
    <script type="text/javascript" language="JavaScript">
    
    a=1
    b=3
    c=6
    d=-8
    
    document.write(a+"x<sup>3</sup>+"+b+"x<sup>2</sup>+"+c+"x+"+d+"=0<hr>")
    last=new Array
    
    if(d<0)
    D=-d
    for(i=0;i<=D;i++){
    if(D%_i==0){
     last.push(i)
     last.push(-i)
    }
    }
    
    document.write(last+"<hr>")
    
    for(j=0;j<last.length;j++){
    n1=a*last[j]
    n2=b+n1
    n3=n2*last[j]
    n4=c+n3
    n5=n4*last[j]
    if(d-n5==0){
    m1=n1;
    m2=n2;
    m3=n3;
    m4=n4;
    m5=n5
    k=-last[j]
    j+=last.length
    }
    
    }
    
    delta=Math.sqrt(m2*m2-4*a*m4)/(2*a)
    x1=-k
    x2=(-m2/(2*a))+delta
    x3=(-m2/(2*a))-delta
    
    if(k>0)
    k="+"+k;
    
    if(m2==1)
    m2="+";
    else if(m2>0)
    m2="+"+m2;
    
    if(m4>0)
    m4="+"+m4;
    document.write("(x"+k+")("+a+"x<sup>2</sup>"+m2+"x"+m4+")=0<hr>")
    document.write("S{"+x1+";"+x2+";"+x3+"}")
    
    
    document.write("<hr><table width=150><tr><td></td><td id=l1>"+a+"</td><td>"+b+"</td><td>"+c+"</td><td id=l1>"+d+"</td></tr><tr><td>"+(-x1)+"</td><td id=l1></td><td>"+m1+"</td><td>"+m3+"</td><td id=l1>"+m5+"</td></tr><tr><td id=l2></td><td id=l3>"+a+"</td><td id=l2>"+m2+"</td><td id=l2>"+m4+"</td><td id=l3>0</td></tr></table>")
    </script>
    </head></body></html>
    Nel caso trovaste la soluzione di questo problema, pre favore inivatemi un e-mail all'indirizzo:
    [indirizzo email editato]

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    benvenuto,
    ho editato il tuo messaggio togliendo l' indirizzo email per due motivi:
    1 - non e' il caso di fornire indirizzi email in un forum pubblico,
    indirizzi che finirebbero direttamente negli archivi di chi invia spam (posta indesiderata)
    2 - non rientra nella filosofia di questo forum chiedere aiuto in privato:
    tutte le discussioni sono pubbliche e vanno risolte pubblicamente,
    questo per aiutare altri che in futuro potrebbero avere un problema simile
    e per aumentare le possibilita' di ricevere risposta

    ciao, buon proseguimento

  3. #3
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    non ho capito...
    non sai cos'è la regola di ruffini o non capisci come funziona lo script che hai postato?

    nel primo caso http://it.wikipedia.org/wiki/Regola_di_Ruffini
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  4. #4
    E nel secondo caso? :master:
    Io avevo in realtà creato uno script, che mi applicasse la regola di Ruffini su un'equazione di 3 grado, ma per qualche motivo non funziona!
    Sapete aggiustarlo?

  5. #5
    io vedo

    codice:
     if(D%_i==0)
    invece di
    codice:
     if(D%i==0)
    c'e' un underscore di troppo. Togli quello e almeno lo script va a buon fine. Fammi sapere se poi fa il suo dovere con Ruffini. E' passato moooooooolto tempo da quando l'ho dovuta usare l'ultima volta

  6. #6

    Forse ho la soluzione, (ma ne dubito)

    Ah! Giusto colpa mia
    In questo modo ora lo script parte però, anche modificando quest'istruzione non mi dà il risutato che volevo!
    Forse però ho trovato un qualcosa che posso modificare per la riuscita di questo programma
    anche se non sono sicuro che questa modifica funzioni, se si cambiano i valori delle variabili dati.
    Comunque, per questi valori, mi sono accorto che se scrivendo nella terz'ultima riga "<tr><td>"+x1+"</td>" invece di cosi "<tr><td>"+(-x1)+"</td>" dovrebbe funzionare.
    In poche parole ho invertito il valore del divisore nello schema di Ruffini.

    Penso che per i valori che ho dato a cooefficenti di questa equazione questa modifica risuti utile, ma come ho gia detto, non sono sicuro che si possa applicare ad un altra equazione con valori differenti.

    Se sapete suggerirmi soluzioni alternative per risolvere definitivamente questo problema, scrivetemi.

    Grazie per l'aiuto che mi avete dato fin'ora. Se sapeste aiutarmi anche in questa occasione sarei molto felice.

  7. #7
    Secondo me l'errore e' in questa riga invece

    codice:
    if(d-n5==0)
    che dovrebbe essere:

    codice:
    if(d+n5==0)
    Infatti le righe della tabella vanno sempre sommate. Cosi' funziona ma poi ci sono altri due errori che non sempre si verificano.

    primo:

    codice:
    if(d<0)
       D=-d
    Cosa succede se per caso d e' maggiore di zero? Che l'if non viene eseguito e D non viene definito e il programma si ferma

    meglio fare cosi':

    codice:
    D = Math.abs(d)
    secondo

    Cosa succede se NON ci sono soluzioni? Che non viene eseguito questo if

    codice:
    if(d+n5==0)
    E questo e' proprio il tuo caso quando metti d=-8.

    Allora ti conviene mettere un controllo. Ad esempio una variabile che chiamerai trovato che verra' inizializzata a false e che farai diventare true solo nel caso che si entri nell'if. Poi dovrai gestire la cosa con un messaggio di errore

    codice:
    if(trovato == true)
    {
         qua ci metti tutti i calcoli
         e stampi la tabella
    }
    else
        document.write("Divisore non trovato")
    ecco comunque il mio codice. Scusa se cambio l'indentazione ma io sono abituato cosi'...

    Ciao

    Codice PHP:
    <html>
    <
    head>
    <
    style>table{text-align:center;border-collapse:collapse}
    #l1{border-left:2px solid black}#l2{border-top:2px solid black}
    #l3{border:2px solid black;border-right:0px;border-bottom:0px}</style>
    <script type="text/javascript" language="JavaScript">

    a=1
    b
    =3
    c
    =6
    d
    =-8

    document
    .write(a+"x<sup>3</sup>+"+b+"x<sup>2</sup>+"+c+"x+"+d+"=0<hr>")
    last=new Array

    //if(d<0)
        //D=-d
    Math.abs(d);
    for(
    i=0;i<=D;i++)
    {
        if(
    i==0)
        {
            
    last.push(i)
            
    last.push(-i)
        }
    }

    document.write(last+"<hr>")

    for(
    j=0;j<last.length;j++)
    {
        
    trovato false;
        
    n1=a*last[j]
        
    n2=b+n1
        n3
    =n2*last[j]
        
    n4=c+n3
        n5
    =n4*last[j]
        if(
    d+n5==0)
        {
            
    trovato true;
            
    m1=n1;
            
    m2=n2;
            
    m3=n3;
            
    m4=n4;
            
    m5=n5
            k
    =-last[j]
            
    j+=last.length
        
    }
    }
    if(
    trovato)
    {
        
    delta=Math.sqrt(m2*m2-4*a*m4)/(2*a)
        
    x1=-k
        x2
    =(-m2/(2*a))+delta
        x3
    =(-m2/(2*a))-delta
        
    if(k>0)
            
    k="+"+k;
        if(
    m2==1)
            
    m2="+";
        else if(
    m2>0)
            
    m2="+"+m2;
        if(
    m4>0)
        
    m4="+"+m4;
        
    document.write("(x"+k+")("+a+"x<sup>2</sup>"+m2+"x"+m4+")=0<hr>")
        
    document.write("[i]S{"+x1+";"+x2+";"+x3+"}[/i]")
        
    document.write("<hr><table width=150><tr><td></td><td id=l1>"+a+"</td><td>"+b+"</td><td>"+c+"</td><td id=l1>"+d+"</td></tr><tr><td>"+(-x1)+"</td><td id=l1></td><td>"+m1+"</td><td>"+m3+"</td><td id=l1>"+m5+"</td></tr><tr><td id=l2></td><td id=l3>"+a+"</td><td id=l2>"+m2+"</td><td id=l2>"+m4+"</td><td id=l3>0</td></tr></table>")
        
    document.write("Trovato il divisore");
    }
    else
        
    document.write("Divisore NON trovato");
    </script>
    </head></body></html> 

  8. #8
    Grazie raven74!

    Ora finalmente questo programma in Javascript funziona! Ovvio la grafica è ancora da sistemare ma l'algoritmo è ok.

    Il primo errore era anche banale, ma la soluzione per il secondo non la conoscevo proprio.

    Però non ho capito l'ultimo.
    Prima di tutto, io sapevo che il Teorema di Ruffini fosse in grado di scomporre ogni genere di equazione (in questo caso, il programma dovrebbe scomporre quelle di 3° grado), indipendentemente dai suoi coefficenti.
    Mah, forse non è cosi :master:

    Cmq, per rendere ancora più scorrevole il testo e per eliminare tutte quella serie di assegnazioni
    codice:
    m1=n1;
    m2=n2;
    m3=n3;
    m4=n4;
    m5=n5
    k=-last[j]
    j+=last.length
    si potrebbe scrivere all'interno dell'if al posto di
    codice:
    if(d+n5==0){
      trovato = true;
      m1=n1;
      m2=n2;
      m3=n3;
      m4=n4;
      m5=n5
      k=-last[j]
      j+=last.length
    }
    si potrebbe scrivere una cosa del genere:
    codice:
    if(d+n5==0){
      trovato = true;
      k=-last[j]
      return false
    }
    In questo modo, con l'istruzione return si eviterebbe tutto quel passagio di informazioni dalle variabili di ciclo a quelle esterne utilizate per i calcoli.
    in modo da utilizzare solo le variabili n1,n2,n3,n4,n5.

    Cosa ne pensi?

  9. #9
    in modo da utilizzare solo le variabili n1,n2,n3,n4,n5.

    Cosa ne pensi?
    Si', il codice puo' essere pulito e reso piu' snello in molti modi. Ad esempio potresti espanderlo per poter gestire anche polinomi di grado piu' elevato utilizzando un array...

    Ma queste sono sfumature lasciate alla discrezione del programmatore.

    Però non ho capito l'ultimo.
    Prima di tutto, io sapevo che il Teorema di Ruffini fosse in grado di scomporre ogni genere di equazione (in questo caso, il programma dovrebbe scomporre quelle di 3° grado), indipendentemente dai suoi coefficenti.
    Mah, forse non è cosi
    Cerco di rispolverare i miei ricordi di universita'... ma mi pare ovvio che non tutti i polinomi contemplino divisore. Ad esempio come scomponi il semplice polinomio x^2+1 ?

    Il teorema di ruffini ti dice che se c'e' divisore allora le puoi trovare col tuo algoritmo. Ma potrebbe non esserci. Magari fosse cosi' semplice trovare la soluzione di un polinomio!!!

    A volte si puo' cadere in errore per questo motivo: e' vero che si puo' utilizzare Ruffini per dividere due polinomi qualsiasi... ma a patto di avere un resto che potrebbe essere diverso da zero.

    Leggi con attenzione il link segnalato da fcaldera e tutto sara' piu' chiaro. (io non brillo per chiarezza )

    Ciao

  10. #10
    Ah è vero
    Comunque ho sbagliato nell'utilizzare return false per fermare il ciclo, perché in questo modo si blocca totalmente lo script
    codice:
    if(d+n5==0){
      trovato = true;
      k=-last[j];
      return false;
    }
    Per fermare il ciclo (evitando la creazione delle variabili m1, m2, m3, m4, m5) è utile convien usare l'istruzione break.
    codice:
    if(d+n5==0){
      trovato = true;
      k=-last[j];
      break;
    }
    Grazie comunque per l'aiuto

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