如何编写Python循环实现f(n+1)=ln|f(n)|混沌映射并排除1、e初始值
错误原因梳理
- 第一版math代码问题:
- lambda表达式参数名与存储迭代值的变量名均为
f,产生命名冲突 - 循环直接将迭代序号
ii传入函数计算,未使用初始值,第一次传入ii=0时计算ln(0)触发定义域错误
- lambda表达式参数名与存储迭代值的变量名均为
- 第二版math代码问题:
lambda表达式内部调用自身,形成无限递归,触发递归深度超限错误 - 你提供的numpy版本存在逻辑错误:
- 直接使用
np.empty初始化的未赋值垃圾值作为初始值 - 每一步计算的是当前下标数组元素本身的对数绝对值,不符合
f(n+1)=ln|f(n)|的递推逻辑
- 直接使用
仅使用math库的正确实现
首先需注意初始值不能为1或e,否则后续迭代会出现ln(0)的定义域问题,代码中增加了初始值校验逻辑:
import math # 迭代次数配置 num_iters = 10 # 初始值可自行修改,禁止为1或e init_value = 2.0 # 初始值合法性校验,用浮点误差阈值避免精度问题 if abs(init_value - 1) < 1e-9 or abs(init_value - math.e) < 1e-9: raise ValueError("初始值不能为1或e") current = init_value for _ in range(num_iters): current = math.log(math.fabs(current)) print(current)
如果需要存储所有迭代结果,可以用列表记录:
import math num_iters = 10 init_value = 2.0 if abs(init_value - 1) < 1e-9 or abs(init_value - math.e) < 1e-9: raise ValueError("初始值不能为1或e") # 存储所有迭代值,第一个元素为初始值 f_sequence = [init_value] for _ in range(num_iters): next_val = math.log(math.fabs(f_sequence[-1])) f_sequence.append(next_val) print(next_val)
内容的提问来源于stack exchange,提问作者Sam Andersson
相关产品推荐
相关产品推荐

