У меня есть этот код, я пытаюсь получить фиксированные точки из функции на каждой итерации от 1 до n:
import sympy as sp
def logistica():
return lambda r,x : r * x * (1 - x)
def orbitas_periodicas(f,n):
"""
Calcula las órbitas periódicas con periodo 'n' de una función f
que debe ser polinomica.
"""
lista_res = [] # Lista de listas que guarda los puntos fijos de cada fk con k = 1,2,3,...,n
x = sp.Symbol("x")
for i in range(1, n+1):
print(f"Calculando órbitas periódicas de periodo {i}")
# Calculamos las raices de: ecuacion(x) = f(x) - x = 0
ecuacion = sp.Eq(f(x) - x, 0)
raices = sp.solve(ecuacion)
derivada = sp.diff(f(x), x) # Derivada de f
derivada = sp.lambdify(x, derivada)
aux = []
for raiz in raices:
print(raiz)
if abs(derivada(raiz)) < 1:
aux.append((raiz, "atractivo"))
elif abs(derivada(raiz)) > 1:
aux.append((raiz, "repulsivo"))
lista_res.append(aux)
f = f(f(x))
return lista_res
Функция orbitas_periodicas
вызывается так:
f =lambda x: logistica()(5,x)
print(orbitas_periodicas(f, 2))
Вот обратная связь
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
.../hoja1.ipynb Cell 22 line 6
1 c = 5
3 f =lambda x: logistica()(c,x)
----> 6 print(orbitas_periodicas(f, 2))
.../hoja1.ipynb Cell 22 line 1
9 print(f"Calculando órbitas periódicas de periodo {i}")
12 # Calculamos las raices de: ecuacion(x) = f(x) - x = 0
---> 13 ecuacion = sp.Eq(f(x) - x, 0)
15 raices = sp.solve(ecuacion)
16 derivada = sp.diff(f(x), x) # Derivada de f
TypeError: 'Mul' object is not callable
Я предполагаю, что когда я делаю f = f(f(x))
, я преобразую свою функцию в недопустимый тип, но я не знаю, в чем именно заключается ошибка.
@MichaelButscher на итерации i я пытаюсь получить f^i(x). Имейте в виду, что я рассматриваю это как символ
Если f is a python function (callable), the
f(x)` является результатом вызова этой функции. Это может быть выражение Sympy, но это не функция Python. f=...
присваивает это новое значение f
. Это больше не функция Python, и ее нельзя использовать, как раньше.
Вы неудачно путаете лямбда-выражения Python и выражения Sympy. Поэтому f
всегда должно быть лямбда-выражением Python для преобразования выражения Sympy в другое выражение Sympy. Добавьте еще одну переменную f_x
, которая всегда является симпатичным выражением (результат формы вызова f
).
Кстати, вызывать f(x)
несколько раз нет необходимости (если f
не меняется), поскольку он всегда будет возвращать одно и то же выражение для одного и того же выражения в x
.
Тогда это выглядит так:
def orbitas_periodicas(f,n):
"""
Calcula las órbitas periódicas con periodo 'n' de una función f
que debe ser polinomica.
"""
lista_res = [] # Lista de listas que guarda los puntos fijos de cada fk con k = 1,2,3,...,n
x = sp.Symbol("x")
f_x = f(x)
for i in range(1, n+1):
print(f"Calculando órbitas periódicas de periodo {i}")
# Calculamos las raices de: ecuacion(x) = f(x) - x = 0
ecuacion = sp.Eq(f_x - x, 0)
raices = sp.solve(ecuacion)
derivada = sp.diff(f_x, x) # Derivada de f
derivada = sp.lambdify(x, derivada)
aux = []
for raiz in raices:
print(raiz)
if abs(derivada(raiz)) < 1:
aux.append((raiz, "atractivo"))
elif abs(derivada(raiz)) > 1:
aux.append((raiz, "repulsivo"))
lista_res.append(aux)
f_x = f(f_x)
return lista_res
Правильно,
f = f(...)
присваиваетf
значение, возвращаемое вызовомf
. Для чего предназначена эта строка?