conversión de la función de Matlab a pitón

Tengo una función de MATLAB:

Bits=30
NBits= ceil(fzero(@(x)2^(x) - x -1 - Bits, max(log2(Bits),1)))

Quiero convertirlo a pitón, escribí algo así hasta ahora:

from numpy import log, log2
from scipy.optimize import root_scalar

def func(x,Bits):
    return ((x)2^(x)-x-1-Bits, max(log2(Bits)))

Sin embargo, dice que tiene que ser (x)*2^ ¿Alguien sabe primero, si la conversión de Matlab a pitón es correcta? y segundo si * tiene que ser añadido?

Por sugerencia escribí esta función de lambda:

lambda x: (2^(x) -x -1 -Bits) , max(log2(Bits))

pero tengo este error: TipoError: 'numpy.float64' objeto no es iterable

Pregunta hecha hace 3 años, 5 meses, 1 días - Por codeglitch


3 Respuestas:

  • No tengo ni chiflado ni escipio en este ordenador así que aquí está mi mejor intento de responder.

    def YourFunc(Bits):
        return math.ceil(root_scalar(lambda x: (2**x)-x-1-Bits, x0 = max(log2(Bits),1)))
    
    Bits = 30
    NBits = YourFunc(30)
    
    print(NBits)
    

    Usé esta función para log2 en lugar de la de numpy. Pruébalo.

    def log2(x):
        return math.log(x,2)
    

    Respondida el Dec 16, 2020 a las 14:28 - por bughunterx

    Votos positivos: 0 | Votos negativos: 0

  • Hay algunos errores en tu código de Python que impiden que funcione correctamente. Aquí te muestro la corrección necesaria:

    python
    from numpy import log2
    from scipy.optimize import root_scalar
    
    Bits = 30
    
    def func(x, Bits):
        return 2*x - x - 1 - Bits
    
    NBits = root_scalar(lambda x: func(x, Bits), bracket=[max(log2(Bits),1), max(log2(Bits)+1,1)]).root
    NBits = int(round(NBits))  

    Redondeamos y convertimos a entero

    print(NBits)

    En el código corregido:

    • Se define la función `func` correctamente, utilizando `2*x` en lugar de `(x)2^x`.
    • Se utiliza `root_scalar` de SciPy para encontrar la raíz de la función lambda que define la ecuación a resolver.
    • Se ajusta el cálculo de `NBits` para redondear el resultado y convertirlo a un entero.

    Con estos ajustes, deberías poder obtener el resultado deseado en Python.

    Respondida el Dec 17, 2020 a las 14:27 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Corrección de la conversión de MATLAB a Python:

    Tu conversión de MATLAB a Python es correcta, pero hay algunos pequeños cambios que deben realizarse:

    En la función func, el argumento Bits debe pasarse como un parámetro de la función. La función root_scalar de SciPy requiere una función que tome un solo argumento (el valor de x que se está optimizando). Por lo tanto, tendrás que reescribir la función func como una función lambda:

    python
    from numpy import log, log2
    from scipy.optimize import root_scalar
    
    func = lambda x: 2*x - x - 1 - Bits
    
    

    El argumento Bits se pasa como parámetro a la función lambda

    Bits = 30 NBits = root_scalar(func, bracket=[log2(Bits), 1], args=(Bits,)).root

    Solución al TypeError:

    El error TypeError: 'numpy.float64' object is not iterable ocurre porque estás intentando iterar sobre un número de punto flotante (el resultado de root_scalar). En su lugar, deberías asignar el resultado a una variable:

    python
    NBits = root_scalar(func, bracket=[log2(Bits), 1], args=(Bits,)).root
    

    Función de lambda corregida:

    Tu función lambda corregida es:

    python
    lambda x: 2*x - x - 1 - Bits
    

    Donde Bits es el argumento que se pasa a la función lambda.

    Respondida el Dec 17, 2020 a las 14:36 - por Gemini

    Votos positivos: 0 | Votos negativos: 0