Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    problema di scrittura di una formula matematica in java

    devo scrivere questa formula in un mio programma:


    io ho fatto così:
    codice:
    public static double terzoGrado(double a,double b,double c,double d){
    double f=(-2*Math.pow(b,3)+9*a*b*c-27*Math.pow(a,2)*d)/(54*Math.pow(a,3));
    double g=(3*a*c-Math.pow(b,2))/(9*Math.pow(a,2));
    double h=b/(3*a);
    double risultato=(Math.pow(f+Math.sqrt(Math.pow(f,2)+Math.pow(g,3)),1/3)+Math.pow(f-Math.sqrt(Math.pow(f,2)+Math.pow(g,3)),1/3))-h;
    return risultato;
    }
    ma questa formula dà risultati sbagliati!
    Premetto che essa è la formula risolutiva delle equazioni di terzo grado,provando il codice nel main ad esempio:
    codice:
    System.out.println(terzoGrado(51,99,851,739));
    dà come risultato:
    1.3529411764705883
    invece che:
    -0.9202010552801512
    data dai calcolatori matematici tipo derive o altri online

    cosa e dove ho sbagliato nel codice?mi date una mano?io non riesco a trovare l'errore
    grazie!

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Sappi che te l'ho controllata tutta (raggruppamenti a fattore comune compresi)... se mai ci incontreremo mi dovrai offrire una birra! )

    A parte gli scherzi, il problema dovrebbe essere sulle due radici terze: 1/3 viene interpretato come una divisione INTERA, quindi con risultato 0. Ne consegue che la tua radice diventa in realtà un elevamento a potenza con esponente 0.

    Prova a utilizzare 1.0/3.0... così funziona?

    Tieni presente che quando lavori con numeri a virgola mobile molto piccoli o molto grandi (potrebbe avvenire con qualche passaggio della tua funzione) rischi di incorrere in errori di precisione, causati dal funzionamento dell'aritmetica floating-point.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    mmm...ci ho provato mettendo in atto le tue idee ma così facendo mi dà come risultato "NaN"...
    bè comunque grazie,a seguire tutti i raggruppamenti e cose varie che ho fatto,lo so è un pò una scocciatura,avendo l'occasione anche due di birre

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Mmm, eppure per il resto sembrava corretto... non ti conviene cannibalizzarla e testarla pezzo per pezzo? Che so, ti stampi f, g, e h e vedi se vanno bene, poi provi a eseguire a "pezzi" la formula che calcola la variabile risultato... così dovresti riuscire a risalire al problema.

    Fammi sapere, in caso posso darci un altro occhio domani mattina!

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    credo proprio che dovrò fare così
    ma che scocciatura (fa questo effetto a me,figuriamoci a voi esterni al problema )

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Mi è venuta in mente una cosa:essendo un'equazione di 3° grado le soluzioni di essa saranno 3,delle quali una nel campo reale(un numero reale) e due radici complesse e coniugate.
    Secondo me il problema sta proprio qui.Io ho messo una sola variabile double risultato per prendere soltanto il valore reale dell'equazione,ma secondo me lui è come se sovrascrivesse le tre radici nella stessa variabile scrivendo per ultima,e quindi quella definitiva che verrà poi stampata,quella immaginaria che calcolata tramite la classe Math dà "NaN" errore matematico in quanto verrà l'argomento della radice quadrata <0
    Sono abbastanza convinto che il problema sia proprio questo!
    Ma detto ciò come posso salvare soltanto il valore reale,cioè il non "NaN" nella variabile risultato?
    posso fare qualcosa tipo:
    codice:
    double ris=blablabla formula risolutiva
    double risultato;
    if(!Double.isNaN(ris)){
    risultato=ris;
    }
    bè questo codice l'ho provato e ancora non va bene...ma penso che l'idea stia andando verso il giusto...
    penso(magari mi sbaglio) che il calcolo di risultato sia fatto tre volte,quindi mi basterebbe controllare ad ogni calcolo se è NaN,in tal caso non permettere l'assegnazione,in caso contrario procedo salvando il valore nella variabile risultato...ma come fare tutto ciò?

  7. #7
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Allora, ho rivisto la formula: con i valori che hai fornito (51,99,851,739) effettivamente la formula va a NaN sulla seconda radice terza (anche se da reminiscenze dell'esame di analisi la radice CUBICA di un numero negativo ha un valore reale... mi puoi confermare?).

    Innanzitutto ti consiglio di scorporare tutti i vari passaggi anzichè avere un formulone unico di difficile gestione e leggibilità: puoi utilizzare altre variabili temporanee oltre alle f, g e h che hai definito.

    Secondo: il programma ti calcola sempre una sola soluzione. Per dire: con radice quadrata di 4 ti restituisce sempre e solo +2 e mai -2.

    Io farei così.
    Dando per scontato che il parametro "a" deve sempre essere diverso da 0 (è un denominatore), le condizioni problematiche le incontri con le radici quadrate (interne) e le radici terze (esterne).
    Il contenuto delle due radici QUADRATE interne deve essere sempre positivo: se fosse negativo ti troveresti un numero immaginario che java non può gestire da solo (probabilmente potresti mettere in piedi un qualche sistema per farlo tu, ma qui non ricordo abbastanza per aiutarti).
    Quindi, quando calcoli la radice quadrata Java ti restituirà il risultato positivo; tu dovrai fargli valutare anche il risultato negativo, tramite un'inversione di segno. Avrai quindi 4 casi, visto che hai due radici quadrate: pos-pos, pos-neg, neg-pos, neg-neg.
    A questo punto valuti il contenuto delle due radici terze, eseguendo la somma/differenza interna: se risultasse positiva puoi calcolare direttamente la radice; se fosse negativa avresti il problema del NaN. Ma tu potresti invertire il segno, calcolare la radice e quindi ripristinare il segno negativo.

    Spero di non aver commesso errori matematici...
    Cosa ne pensi?

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.