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 argumentoBits
debe pasarse como un parámetro de la función. La funciónroot_scalar
de SciPy requiere una función que tome un solo argumento (el valor dex
que se está optimizando). Por lo tanto, tendrás que reescribir la funciónfunc
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,)).rootSolució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 deroot_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