Domanda Aiuto con programma per equazioni di 1° e 2° grado

Stato
Discussione chiusa ad ulteriori risposte.

Consilvio

Utente Silver
18 Dicembre 2013
100
13
3
65
Salve a tutti inforgiani studiando un po di python ultimamente mi è venuta l'idea di buttare giu un piccolo programma che risolva equazioni di 1° e 2° grado ( ho iniziato da poco a programmare non mi uccidete per il codice che scrivo ahah). Ora vorrei aggiungere anche una funzione che risolva i radicali( ce li avete presenti?) come potrei fare in modo che l'interprete capisca quando un numero è un radicale.. questo è il problema mi sto scervellando da un po ma non trovo soluzioni. Questo è il programma ripeto non sparatemi ahah

Codice:
import math





class equazione:
    def __init__(self,a,b,c,n,d):
        self.a = a
        self.b = b
        self.c = c
        self.n = n


    def variabili2():
       global a
       global b
       global c
       a = int(input("Inserisci la a dell'equazione: "))
       b = int(input("Inserisci la b dell'equazione: "))
       c = int(input("Inserisci la c dell'equazione: "))
       return a,b,c


    def variabili() :
        global n
        global d
        d = int(input("Inserisci il coefficiente dell'incognita: "))
        n = int(input("Inserisci il termine noto: "))
        return n,d


    
        
    def solv_equazione2(a,b,c):
       delta = b**2-(4*a*c)
       if delta < 0:
           print("Impossibile risolvere quest'equazione")
       elif delta == 0:
           sol = -b/2*a
           print( sol)
       elif delta > 0:  
           sol1 = -b + delta/2*a
           sol2 = -b - delta/2*a
           print(sol1,sol2)


    def formula_semplificata(a,b,c):
        delta = (b/2)**2 - a*c
        x1 = -(b/2) + math.sqrt(delta)/ a
        x2 = -(b/2) - math.sqrt(delta)/a
        print(x1,x2)


    def solv_equazione(d,n):
        x = d/(-n)
        print(x)
        


        
     


def riga():
    print('')




def analizza_equazione2(a,b,c):
        if b%2 == 0:
            equazione.formula_semplificata(a,b,c)
        elif b%2 != 0:
            equazione.solv_equazione2(a,b,c)


def analizza_equazione(d,n):
    if d == 0:
        print('Equazione Impossibile ')
    elif d == 0 and n == 0:
        print('Equazione indeterminata ')
    else:
        equazione.solv_equazione(n,d)
        
        




def menu(equazione):
    riga()
    print('Questo facile ed intuitivo programma risolve equazioni di 1 e 2 grado')
    riga()
    print('1.Risolvi Equazione di 1° Grado')
    riga()
    print('2.Risolvi Equazione di 2° Grado')
    riga()
    scelta = int(input('Fai la tua scelta giovane: '))
    if scelta == 2:
        equazione.variabili2()
        analizza_equazione2(a,b,c)
    elif scelta == 1:
        equazione.variabili()
        analizza_equazione(d,n)
            






if __name__ == '__main__':
    menu(equazione)
 
print("Impossibile risolvere quest'equazione")

Il mio profe di mate ti direbbe: NOOOOO, non è impossibile, non è un numero reale. Pensa ai primitivi, conoscevano solo i numeri interi, per loro non esisteva 2/3 di un albero :')

Comunque per far capire quando è radicale hai diverse soluzioni, una peggio dell'altra:
-Chiedere se è radicale, se lo è lo mette in un'altra variabile
-scrivere prima del numero qualcosa, per esempio una v
-scrivere il numero così: √3

Poi ovviamente aggiungi i dovuti controlli.
 
  • Mi piace
Reazioni: Consilvio
Ma quando un termine è elevato, nei linguaggi di programmazione non si scrive b^2? Inoltre dovresti ricordarti che il discriminante si trova sotto una radice quadrata e che si risolve prima -b+-discriminante e poi si divide per 2a. Inoltre, se il delta è <0 le radici non solo reali.
 
Ma quando un termine è elevato, nei linguaggi di programmazione non si scrive b^2? Inoltre dovresti ricordarti che il discriminante si trova sotto una radice quadrata e che si risolve prima -b+-discriminante e poi si divide per 2a. Inoltre, se il delta è <0 le radici non solo reali.

In python no, si usa il doppio asterisco.
Hai ragione, lo ha messo nella formula ridotta, ma si è dimenticato nell'altra. Inoltre ora che guardo il codice ricordati che:
-b + delta/2*a

significa che prima esegue delta/2*a e poi ci toglie b. Quindi per fare la formula corretta devi scrivere:
(-b+delta)/2*a
 
  • Mi piace
Reazioni: Consilvio
In python no, si usa il doppio asterisco.
Hai ragione, lo ha messo nella formula ridotta, ma si è dimenticato nell'altra. Inoltre ora che guardo il codice ricordati che:
-b + delta/2*a

significa che prima esegue delta/2*a e poi ci toglie b. Quindi per fare la formula corretta devi scrivere:
(-b+delta)/2*a

Grazie mille piccolo errore pardon. Per questa cosa dei numeri complessi non me la ricordo bene sarei grado a chiunque me la volesse spiegare ( in matematica).
 
Grazie mille piccolo errore pardon. Per questa cosa dei numeri complessi non me la ricordo bene sarei grado a chiunque me la volesse spiegare ( in matematica).
La formula risolutiva è:
(-b+-radical b^2 - 4ac)/2
In realtà non serve la parentesi, poiché il 2 si trova sotto la linea di frazione, ma sul pc bisogna specificare ciò che si va ad analizzare per prima.
Inoltre il discriminante, ovvero il fattore sotto la radice può essere di 3 tipi:
Delta>0 I risultati sono reali e distinti
Delta=0 I risultati sono reali e coincidenti
Delta<0 Le radici non sono reali

PS: Se devi fare altri programmi riguardo la matematica fammi un fischio, che mi piace un sacco la matematica :D
 
Premetto di non conoscere Python, ma:

Per la questione dei radicali, puoi prendere in input una stringa anziché tre interi (interi? Non possono esserci coefficienti decimali? D; ), così ne trai due vantaggi: prevenzione degli errori, e possibilità di parsare la stringa, tipo, fai inserire "rad2" per la radice di 2, "3rad4" per la radice terza di 4, e così via. Sarebbe anche carino fare un parser decente, in modo che l'utente inserisca direttamente l'equazione, magari all'inizio già ordinata, poi anche disordinata.

Per la questione del delta negativo, anziché scrivere "Impossibile risolvere" scrivi "Impossibile risolvere in R". Se vuoi addentrarti nei complessi non c'è nulla di troppo difficile, ti basta sapere che l'unità immaginaria i vale rad(-1) (lasciamo la teoria che c'è dietro).

Facendo un esempio, in 4(X^2) + 5x + 3 = 0 il delta diventa rad(25-48) = rad(-23) = rad(23 * (-1)) = rad(23) * rad(-1) = rad(23) * i

Le tue soluzioni saranno quindi x1 = -5/8 + (rad(23)/8) * i e, analogamente, x2 = -5/8 - (rad(23)/8) * i

Spero di essermi spiegato, potrei aver fatto delle cappellate nei calcoli, ma i concetti dovrebbero capirsi.
 
  • Mi piace
Reazioni: Consilvio
Premetto di non conoscere Python, ma:

Per la questione dei radicali, puoi prendere in input una stringa anziché tre interi (interi? Non possono esserci coefficienti decimali? D; ), così ne trai due vantaggi: prevenzione degli errori, e possibilità di parsare la stringa, tipo, fai inserire "rad2" per la radice di 2, "3rad4" per la radice terza di 4, e così via. Sarebbe anche carino fare un parser decente, in modo che l'utente inserisca direttamente l'equazione, magari all'inizio già ordinata, poi anche disordinata.

Per la questione del delta negativo, anziché scrivere "Impossibile risolvere" scrivi "Impossibile risolvere in R". Se vuoi addentrarti nei complessi non c'è nulla di troppo difficile, ti basta sapere che l'unità immaginaria i vale rad(-1) (lasciamo la teoria che c'è dietro).

Facendo un esempio, in 4(X^2) + 5x + 3 = 0 il delta diventa rad(25-48) = rad(-23) = rad(23 * (-1)) = rad(23) * rad(-1) = rad(23) * i

Le tue soluzioni saranno quindi x1 = -5/8 + (rad(23)/8) * i e, analogamente, x2 = -5/8 - (rad(23)/8) * i

Spero di essermi spiegato, potrei aver fatto delle cappellate nei calcoli, ma i concetti dovrebbero capirsi.

Grazie questa diciamo che era una bozza del programma.. Ci devo lavorare un pò sopra. Per quanto riguarda il delta negativo credo di aver risolto cosi

Codice:
if delta < 0:           riga()
           print("Il risultato non è nell'insieme R ma forse posso aiutarti..")
           sol1 =  ((-b) + math.sqrt(-delta)*(0+1j))/(2*a)
           sol2 = ((-b) - math.sqrt(-delta)*(0+1j))/(2*a)
           riga()
           print(sol1,sol2)

Per i radicali proverò come dici tu

- - - Updated - - -

Premetto di non conoscere Python, ma:

Per la questione dei radicali, puoi prendere in input una stringa anziché tre interi (interi? Non possono esserci coefficienti decimali? D; ), così ne trai due vantaggi: prevenzione degli errori, e possibilità di parsare la stringa, tipo, fai inserire "rad2" per la radice di 2, "3rad4" per la radice terza di 4, e così via. Sarebbe anche carino fare un parser decente, in modo che l'utente inserisca direttamente l'equazione, magari all'inizio già ordinata, poi anche disordinata.

Per la questione del delta negativo, anziché scrivere "Impossibile risolvere" scrivi "Impossibile risolvere in R". Se vuoi addentrarti nei complessi non c'è nulla di troppo difficile, ti basta sapere che l'unità immaginaria i vale rad(-1) (lasciamo la teoria che c'è dietro).

Facendo un esempio, in 4(X^2) + 5x + 3 = 0 il delta diventa rad(25-48) = rad(-23) = rad(23 * (-1)) = rad(23) * rad(-1) = rad(23) * i

Le tue soluzioni saranno quindi x1 = -5/8 + (rad(23)/8) * i e, analogamente, x2 = -5/8 - (rad(23)/8) * i

Spero di essermi spiegato, potrei aver fatto delle cappellate nei calcoli, ma i concetti dovrebbero capirsi.

Piu precisamente cosa intendi per coefficienti decimali
 
Grazie questa diciamo che era una bozza del programma.. Ci devo lavorare un pò sopra. Per quanto riguarda il delta negativo credo di aver risolto cosi

Codice:
if delta < 0:           riga()
           print("Il risultato non è nell'insieme R ma forse posso aiutarti..")
           sol1 =  ((-b) + math.sqrt(-delta)*(0+1j))/(2*a)
           sol2 = ((-b) - math.sqrt(-delta)*(0+1j))/(2*a)
           riga()
           print(sol1,sol2)

Per i radicali proverò come dici tu
Ripeto che non conosco Python, ma esiste davvero una libreria per lavorare con i complessi? Comunque dubito che funzioni, ricordati che tu devi stampare la soluzione nella forma a + ib, oppure sotto forma di vettore (rappresentazione discutibile), ma non potrai mai rappresentarla come un valore unico.

- - - Updated - - -

Piu precisamente cosa intendi per coefficienti decimali
Intendo che, da ignorante, i tuoi input li interpreto come interi, ma non dev'essere necessariamente così... 3.5(X^2)+2x+4.2 = 0 non ha soluzione?
 
Ripeto che non conosco Python, ma esiste davvero una libreria per lavorare con i complessi? Comunque dubito che funzioni, ricordati che tu devi stampare la soluzione nella forma a + ib, oppure sotto forma di vettore (rappresentazione discutibile), ma non potrai mai rappresentarla come un valore unico.

- - - Updated - - -


Intendo che, da ignorante, i tuoi input li interpreto come interi, ma non dev'essere necessariamente così... 3.5(X^2)+2x+4.2 = 0 non ha soluzione?

per quando riguarda i numeri complessi python è in grado di gestirli da se almeno da quanto ne so.
Per gli input se intendi i numeri in virgola basta cambiare quell'int con float e posso gestire anche i numeri in virgola mobile
 
Stato
Discussione chiusa ad ulteriori risposte.