3. Zones d’ajust (2,5 punts)

Es vol estudiar en quins punts enters una funció f queda prou ben ajustada al valor d’entrada. Per fer-ho, donada una funció f i una tolerància tol, definim la puntuació d’un punt x com:

\[\max\left(0,\ tol - \left|f(x)-x\right|\right)\]
  1. Donat un centre c, definim la zona al voltant del centre c com el conjunt d’enters que estan a l’interval \([c-5,c+5]\). Per exemple, la zona al voltant del centre 4 estaria formada pels enters -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

    Dissenya la funció següent desa-la al fitxer zones.py.

    analitza_zona(f, c, tol)

    Analitza la zona al voltant del centre c per trobar quants valors tenen puntuació estrictament positiva i quina és la puntuació més alta.

    Paràmetres:
    • f (function) – funció que rep un enter i retorna un valor numèric

    • c (int) – centre de la zona que es vol analitzar

    • tol (float) – tolerància utilitzada per calcular la puntuació

    Tipus de retorn:

    tuple

    Retorna:

    una tupla formada per dos elements:

    • el nombre de punts dins la zona al voltant de c amb puntuació estrictament positiva i calculada amb tolerància tol y per la funció f.

    • la puntuació més alta entre tots els punts de la zona analitzada arrodonida a dos decimals.

    Els següents doctests mostren exemples del que ha de fer la funció:

    >>> def f(x):
    ...    return 2*x/3
    
    >>> analitza_zona(f, 2, 0.8)
    (5, 0.8)
    >>> analitza_zona(f, -6, 0.8)
    (2, 0.47)
    

    Disposes de més tests al fitxer test-analitza-zona.txt

  2. Dissenya la funció següent desa-la al fitxer zones.py.

    busca_zona(f, c, tol, min_accept)

    Busca la primera zona que tingui com a mínim min_accept punts amb puntuació estrictament positiva.

    La cerca analitza zones centrades al voltant dels centres \(c, c + 1, c + 2 \dots\) fins que troba una amb com a mínim min_accept punts que compleixin la condició anterior.

    Paràmetres:
    • f (function) – funció que rep un enter i retorna un valor numèric

    • c (int) – centre de la primera zona que es vol analitzar

    • tol (float) – tolerància utilitzada per calcular la puntuació

    • min_accept (int) – nombre mínim de punts amb puntuació estrictament positiva que ha de tenir la zona

    Tipus de retorn:

    tuple

    Retorna:

    una tupla de dos elements formada per:

    • el centre de la primera zona trobada amb un mínim de min_accept punts amb puntuació estrictament positiva

    • la millor puntuació entre els punts d’aquesta zona

    Es pot suposar que sempre existeix una zona amb almenys min_accept punts acceptables.

    Aquesta funció ha de cridar la funció analitza_zona().

    Els següents doctests mostren exemples del que ha de fer la funció:

    >>> def f(x):
    ...     return 2 * x / 3
    
    # centre -6, tolerància 0.8, mínim 5 punts puntuació > 0
    
    >>> busca_zona(f, -6, 0.8, 5)
    (-3, 0.8)
    
    # centre -10, tolerància 1.5, mínim 2 punts puntuació > 0
    
    >>> busca_zona(f,-10,1.5,2)
    (-8, 0.5)
    

    Disposes de més tests al fitxer test-busca-zona.txt.

    Disposes de solucions al fitxer zones.py.