[Python] Bisezione per ricorsione

Messaggioda Indrjo Dedej » 04/12/2019, 21:35

Ciao! :smt039
Ho un problema con l'implementazione della funzione di ricerca per bisezione di zeri (approssimati) di funzioni. Non credo sia un problema concettuale (poiché confrontandomi con altri e guardando in giro in rete mi pare di esserci), quanto un problema sintattico.
Codice:
# ESERCIZIO:
# definizione della funzione di ricerca per bisezione
# cerca zeri (approssimati a n cifre decimali) di una funzione
# nell'intervallo [a,b]

def CercaZero(f, a, b, n=2):
    if a >= b:
        return 'deve essere a < b!'
    if f(a)*f(b) >= 0:
        return 'usa degli a e b per cui f(a)*f(b) < 0'
    if f(a) == 0:
        return a
    if f(b) == 0:
        return b
    m = (a+b)/2
    if f(m) == 0:
        return m
    if b-a < 0.5*10**-n:
        return int(10**n*m)/10**n
    if f(a)*f(m) < 0:
        return CercaZero(f, a, m)
    else:
        return CercaZero(f, m, b)

I problemi sorgono quando gli chiedo di fare qualcosa:
Codice:
>>> from math import exp
>>> CercaZero(lambda x: exp(x)+x, -1, 0)
-0.56
>>> CercaZero(lambda x: exp(x)+x, -1, 0, n=4)
-0.56
Cioè sembra che non si sia curato di quel n=4. Come mai?
Io non sono uomo, sono dinamite. ~ Nietzsche
Avatar utente
Indrjo Dedej
Average Member
Average Member
 
Messaggio: 804 di 808
Iscritto il: 31/05/2016, 19:58
Località: Milano

Re: [Python] Bisezione per ricorsione

Messaggioda solaàl » 04/12/2019, 23:28

Non CercaZero(lambda x: exp(x)+x, -1, 0, n=4), ma bensì CercaZero(lambda x: exp(x)+x, -1, 0, 4). Dovrebbe funzionare!
Avatar utente
solaàl
Junior Member
Junior Member
 
Messaggio: 57 di 232
Iscritto il: 31/10/2019, 01:45

Re: [Python] Bisezione per ricorsione

Messaggioda probid » 04/12/2019, 23:45

Entrambe le notazioni vanno bene, il problema è che non passi n nelle chiamate ricorsive :wink:

Ciao!
probid
Starting Member
Starting Member
 
Messaggio: 31 di 38
Iscritto il: 01/10/2010, 19:30

Re: [Python] Bisezione per ricorsione

Messaggioda Indrjo Dedej » 05/12/2019, 06:23

Sì, giusto. Non so perché ho pensato che avergli imposto n=4 una volta, l'avrebbe preso anche nelle chiamate successive, che diventsasse il nuovo default. Ho avuto un flashamento mentale. :lol: E quindi come dovrei fare? Mettere "n=n" alle chiamate succesive?
Io non sono uomo, sono dinamite. ~ Nietzsche
Avatar utente
Indrjo Dedej
Average Member
Average Member
 
Messaggio: 805 di 808
Iscritto il: 31/05/2016, 19:58
Località: Milano

Re: [Python] Bisezione per ricorsione

Messaggioda probid » 05/12/2019, 13:39

Sì, o semplicemente:

Codice:
    if f(a)*f(m) < 0:
        return CercaZero(f, a, m, n)
    else:
        return CercaZero(f, m, b, n)


Ciao!
probid
Starting Member
Starting Member
 
Messaggio: 32 di 38
Iscritto il: 01/10/2010, 19:30

Re: [Python] Bisezione per ricorsione

Messaggioda Indrjo Dedej » 05/12/2019, 17:12

print('Grazie!') :smt039
Io non sono uomo, sono dinamite. ~ Nietzsche
Avatar utente
Indrjo Dedej
Average Member
Average Member
 
Messaggio: 806 di 808
Iscritto il: 31/05/2016, 19:58
Località: Milano


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti