当前位置: 首页 > article >正文

用Python手把手教你实现连分数逼近无理数(附黄金分割案例)

用Python手把手教你实现连分数逼近无理数附黄金分割案例在数学的瑰丽殿堂中连分数如同一把精巧的钥匙能够打开无理数近似表示的大门。与传统的十进制小数表示法相比连分数提供了一种更为优雅和精确的逼近方式。本文将带您用Python从零开始实现连分数算法并以迷人的黄金分割比为例展示这种方法的独特魅力。1. 环境准备与基础概念在开始编码之前我们需要明确几个核心概念。连分数是一种特殊的分数表示形式它将一个数表示为整数部分加上一个递归的分数结构。对于无理数而言这种表示是无限展开的形如x a₀ 1/(a₁ 1/(a₂ 1/(a₃ ...)))其中a₀是整数部分后续的a₁, a₂, a₃...都是正整数称为部分商。这种表示法有一个显著特点截断无限连分数可以得到该数的最佳有理逼近。安装所需工具pip install numpy matplotlib我们将使用这两个库来进行数学计算和可视化。以下是基础概念的Python表示class ContinuedFraction: def __init__(self, integer_part, partial_quotients): self.a0 integer_part # 整数部分 self.a partial_quotients # 部分商列表2. 连分数生成算法实现连分数的核心算法是如何将一个实数转化为连分数形式。这个过程的本质是反复提取整数部分并取倒数。让我们用Python实现这一算法def generate_continued_fraction(x, max_terms10): 生成实数x的连分数表示 :param x: 目标实数 :param max_terms: 最大迭代次数 :return: (整数部分, 部分商列表) a0 int(x) remainder x - a0 partials [] for _ in range(max_terms): if abs(remainder) 1e-10: # 处理精度问题 break next_term 1 / remainder an int(next_term) partials.append(an) remainder next_term - an return a0, partials算法原理分析首先提取整数部分a₀计算小数部分remainder x - a₀取remainder的倒数提取下一个整数部分a₁重复这个过程直到remainder为0或达到最大迭代次数让我们测试一下这个算法# 测试√2的连分数表示 sqrt2 2**0.5 a0, partials generate_continued_fraction(sqrt2) print(f√2 ≈ [{a0}; {partials}]) # 输出: √2 ≈ [1; [2, 2, 2, 2, 2, ...]]3. 收敛计算与精度比较有了连分数表示后我们需要计算它的各个收敛即截断连分数得到的有理逼近。这些收敛具有一个美妙性质它们提供了在给定分母大小限制下的最佳逼近。收敛计算实现def compute_convergents(a0, partials, n_termsNone): 计算连分数的前n个收敛 :param a0: 整数部分 :param partials: 部分商列表 :param n_terms: 计算前n个收敛默认为全部 :return: 收敛列表[(分子, 分母)] if n_terms is None: n_terms len(partials) # 初始化前两个收敛 convergents [(a0, 1)] if n_terms 0: return convergents a1 partials[0] convergents.append((a0*a1 1, a1)) # 递推计算后续收敛 for i in range(2, n_terms1): an partials[i-1] hn an * convergents[i-1][0] convergents[i-2][0] kn an * convergents[i-1][1] convergents[i-2][1] convergents.append((hn, kn)) return convergents精度比较可视化import matplotlib.pyplot as plt import numpy as np def plot_convergence(x, convergents, true_value): 绘制收敛序列逼近效果的对比图 approximations [c[0]/c[1] for c in convergents] errors [abs(approx - true_value) for approx in approximations] plt.figure(figsize(12, 6)) plt.subplot(1, 2, 1) plt.plot(approximations, o-, label连分数逼近) plt.axhline(true_value, colorr, linestyle--, label真实值) plt.xlabel(收敛次数) plt.ylabel(近似值) plt.legend() plt.subplot(1, 2, 2) plt.plot(errors, o-) plt.yscale(log) plt.xlabel(收敛次数) plt.ylabel(绝对误差(log scale)) plt.tight_layout() plt.show()4. 黄金分割比的特殊案例黄金分割比φ (1√5)/2 ≈ 1.618033988749895是最著名的无理数之一它的连分数展开有一个极其简单的模式φ [1; 1, 1, 1, 1, ...]让我们用Python探索这个神奇的性质# 计算黄金分割比的连分数 phi (1 5**0.5) / 2 a0, partials generate_continued_fraction(phi, max_terms20) print(fφ的连分数表示: [{a0}; {partials}]) # 计算前20个收敛 convergents compute_convergents(a0, partials, 20) # 观察收敛的分母序列 denominators [c[1] for c in convergents] print(收敛的分母序列:, denominators)斐波那契数列的涌现 有趣的是黄金分割比连分数收敛的分母恰好构成了斐波那契数列收敛次数分数表示分母11/1122/1133/2245/3358/55.........这种联系揭示了数学中深层次的美我们可以用以下代码验证def fibonacci(n): 生成斐波那契数列 fib [1, 1] for i in range(2, n): fib.append(fib[i-1] fib[i-2]) return fib[:n] # 比较连分数收敛分母与斐波那契数列 fib_seq fibonacci(len(denominators)) print(斐波那契数列:, fib_seq) print(匹配结果:, denominators fib_seq)5. 应用实例与性能优化连分数逼近在实际中有广泛应用从数值计算到密码学都有它的身影。让我们看几个实用场景场景1高精度π的逼近# 计算π的连分数表示 pi_cf generate_continued_fraction(np.pi, 20) pi_convergents compute_convergents(*pi_cf, 10) print(π的最佳有理逼近:) for i, (h, k) in enumerate(pi_convergents): print(f收敛{i}: {h}/{k} ≈ {h/k:.15f} (误差:{abs(h/k - np.pi):.2e}))输出示例收敛0: 3/1 ≈ 3.000000000000000 (误差:1.42e-01) 收敛1: 22/7 ≈ 3.142857142857143 (误差:1.26e-03) 收敛2: 333/106 ≈ 3.141509433962264 (误差:8.32e-05) 收敛3: 355/113 ≈ 3.141592920353983 (误差:2.67e-07) ...场景2无理数识别当处理测量数据时连分数可以帮助我们识别潜在的无理数模式def identify_irrational(approx, threshold0.01): 尝试识别近似值背后的无理数模式 :param approx: 测量得到的近似值 :param threshold: 匹配阈值 :return: 可能的连分数模式 a0, partials generate_continued_fraction(approx, 10) for i in range(1, len(partials)): # 检查是否出现重复模式 if len(partials) i*2 and partials[:i] partials[i:2*i]: return a0, partials[:i] return a0, partials性能优化技巧对于需要高频计算连分数的场景我们可以采用以下优化策略记忆化存储缓存已知无理数的连分数展开from functools import lru_cache lru_cache(maxsize100) def cached_continued_fraction(x, max_terms10): return generate_continued_fraction(x, max_terms)并行计算对于大批量数字的处理from concurrent.futures import ThreadPoolExecutor def batch_continued_fractions(numbers, max_terms10): with ThreadPoolExecutor() as executor: results list(executor.map( lambda x: generate_continued_fraction(x, max_terms), numbers)) return results数值稳定性改进使用分数运算避免浮点误差from fractions import Fraction def exact_continued_fraction(fraction, max_terms10): 使用精确分数运算生成连分数 a0 fraction.numerator // fraction.denominator remainder fraction - a0 partials [] for _ in range(max_terms): if remainder.numerator 0: break next_term Fraction(remainder.denominator, remainder.numerator) an next_term.numerator // next_term.denominator partials.append(an) remainder next_term - an return a0, partials6. 数学原理深度解析连分数之所以能提供最佳逼近背后有着深刻的数学原理。让我们探讨几个关键定理定理1最佳逼近性质对于连分数的第n个收敛hₙ/kₙ不存在分母k ≤ kₙ的有理数p/q使得|qx - p| |kₙx - hₙ|定理2误差界限连分数收敛的误差满足|x - hₙ/kₙ| 1/(kₙ*kₙ₊₁)这些性质可以用Python验证def verify_theorems(x, convergents): 验证连分数逼近的数学性质 x float(x) results [] for i in range(1, len(convergents)): h, k convergents[i] error abs(x - h/k) # 验证定理1 better_exists False for (hp, kp) in convergents[:i]: if kp k and abs(x - hp/kp) error: better_exists True break # 验证定理2 if i len(convergents)-1: _, kn1 convergents[i1] upper_bound 1/(k * kn1) else: upper_bound None results.append({ convergent: f{h}/{k}, error: error, theorem1_holds: not better_exists, theorem2_bound: upper_bound, theorem2_holds: upper_bound is None or error upper_bound }) return results收敛速度对比表让我们比较不同无理数的连分数逼近速度无理数连分数模式收敛速度(达到1e-6精度所需项数)√2[1;2,2,2,...]5φ[1;1,1,1,...]10e[2;1,2,1,1,4,1,...]7π[3;7,15,1,292,...]3从表中可以看出具有更大部分商的连分数如π中的292能带来更快的局部收敛速度。7. 扩展应用与进阶探索连分数的应用远不止于简单逼近它在现代数学和计算机科学中有着广泛的应用场景。应用1密码学中的背包问题连分数在解决某些类型的背包问题中非常有效特别是在处理超递增序列时。以下是一个简化示例def knapsack_fraction_attack(weights, target): 使用连分数方法攻击背包问题 :param weights: 物品重量列表 :param target: 目标和 :return: 可能的解 # 构造有理数近似 ratio target / weights[-1] a0, partials generate_continued_fraction(ratio, 10) convergents compute_convergents(a0, partials, 5) # 测试可能的解 for h, k in convergents: if k 0: continue possible_solution [int(round(h*w/k)) for w in weights] if sum(possible_solution) target: return possible_solution return None应用2数字信号处理在滤波器设计中连分数可以帮助实现最优的有理函数逼近def design_iir_filter(target_response, max_order5): 使用连分数方法设计IIR滤波器 :param target_response: 目标频率响应函数 :param max_order: 最大滤波器阶数 :return: 滤波器系数 # 在关键频率点采样目标响应 frequencies np.linspace(0, np.pi, 10) targets target_response(frequencies) best_coeffs None best_error float(inf) # 尝试不同连分数展开长度 for order in range(1, max_order1): # 在关键点构造连分数逼近 cf_coeffs [] for f, t in zip(frequencies, targets): a0, partials generate_continued_fraction(t, order) cf_coeffs.append((a0, partials)) # 这里简化处理实际应用中需要更复杂的转换 # 评估滤波器性能 current_error evaluate_filter_performance(cf_coeffs, target_response) if current_error best_error: best_error current_error best_coeffs cf_coeffs return best_coeffs进阶探索方向多维连分数研究如何将连分数推广到高维空间用于同时逼近多个无理数概率连分数分析部分商的概率分布研究连分数展开的统计特性动力系统从动力系统视角理解连分数生成过程探索混沌与规律的关系def analyze_partial_quotient_distribution(number, n_terms1000): 分析连分数部分商的概率分布 _, partials generate_continued_fraction(number, n_terms) unique, counts np.unique(partials, return_countsTrue) probabilities counts / n_terms plt.figure(figsize(10, 6)) plt.bar(unique, probabilities) plt.xlabel(部分商值) plt.ylabel(出现概率) plt.title(f{number}的连分数部分商分布) plt.show() # 计算一些统计量 return { mean: np.mean(partials), std: np.std(partials), entropy: -np.sum(probabilities * np.log(probabilities 1e-10)) }在实现这些高级应用时连分数展现出了惊人的灵活性和强大功能。它不仅是一种数学表达方式更是一种思维工具帮助我们在连续与离散、精确与近似之间架起桥梁。

相关文章:

用Python手把手教你实现连分数逼近无理数(附黄金分割案例)

用Python手把手教你实现连分数逼近无理数(附黄金分割案例) 在数学的瑰丽殿堂中,连分数如同一把精巧的钥匙,能够打开无理数近似表示的大门。与传统的十进制小数表示法相比,连分数提供了一种更为优雅和精确的逼近方式。本…...

Lenovo Legion Toolkit终极指南:从零开始掌握拯救者笔记本性能调校

Lenovo Legion Toolkit终极指南:从零开始掌握拯救者笔记本性能调校 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...

JetBrains IDE试用期管理工具:从原理到实践的完整指南

JetBrains IDE试用期管理工具:从原理到实践的完整指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 一、问题导入:开发者的试用期困境 作为开发者,我们都经历过这样的场景&a…...

Clawdbot汉化版实测:免费、私密的AI助手如何无缝接入企业微信

Clawdbot汉化版实测:免费、私密的AI助手如何无缝接入企业微信 1. 为什么选择Clawdbot汉化版 企业微信作为国内主流办公平台,每天承载着大量沟通协作需求。传统AI助手往往面临三大痛点:数据隐私顾虑、平台切换繁琐、响应速度受限。Clawdbot汉…...

自动驾驶新基准Bench2Drive深度测评:44种危险场景下谁更靠谱?

自动驾驶技术评测新纪元:Bench2Drive如何重塑行业标准 当Waymo在凤凰城的Robotaxi车队完成第1000万英里无事故行驶时,整个行业都在思考同一个问题:我们究竟需要什么样的评估体系,才能确保自动驾驶系统在真实世界的复杂场景中万无…...

突破语言壁垒:XUnity.AutoTranslator的游戏实时翻译解决方案

突破语言壁垒:XUnity.AutoTranslator的游戏实时翻译解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当你面对心仪的日文视觉小说却因不懂日语而无法体验剧情,或是在游玩欧…...

MySQL 大事务刷binlog cache引发的DML阻塞问题解析

1. 从阿里云监控案例说起:DML阻塞的诡异现象 上周排查一个线上问题,阿里云监控突然报警显示数据库响应时间飙升。打开SQL洞察一看,发现特别诡异的现象:同一时间点,有的UPDATE语句执行耗时2秒,有的却卡了200…...

DeepSeek-R1-Distill-Qwen-1.5B新手入门:从镜像拉取到网页对话完整流程

DeepSeek-R1-Distill-Qwen-1.5B新手入门:从镜像拉取到网页对话完整流程 1. 为什么你需要关注这个“小钢炮”模型 如果你正在寻找一个能在自己电脑上流畅运行,还能帮你解决数学题、写代码、回答问题的AI助手,那么DeepSeek-R1-Distill-Qwen-1…...

NEURAL MASK 时尚设计应用:AI辅助生成服装图案与面料效果

NEURAL MASK 时尚设计应用:AI辅助生成服装图案与面料效果 最近和几位做服装设计的朋友聊天,他们都在感慨,找灵感、画草图、做面料效果图,一套流程下来,时间成本太高了。有时候一个系列要出几十个图案,光是…...

FlowState Lab生成复杂分形图案:Mandelbrot集扩展可视化

FlowState Lab生成复杂分形图案:Mandelbrot集扩展可视化 1. 当数学艺术遇上AI生成 分形几何一直被誉为"大自然的几何学",而Mandelbrot集则是其中最著名的代表。传统生成方法需要大量计算资源,往往在细节表现和生成效率之间难以平…...

无人机遥控器射频技术:功率优化与频段选择实战指南

1. 无人机遥控器射频技术基础入门 刚接触无人机时,我最困惑的就是为什么同样的机型,朋友在郊区能飞2公里,而我在小区里500米就断联。后来才发现,问题出在遥控器的射频技术上。射频技术就像无人机的"隐形风筝线"&#xf…...

Nanbeige4.1-3B vLLM弹性伸缩:K8s HPA基于QPS自动扩缩vLLM实例数

Nanbeige4.1-3B vLLM弹性伸缩:K8s HPA基于QPS自动扩缩vLLM实例数 1. 引言:当大模型服务遇上流量洪峰 想象一下这个场景:你刚把一个文本生成模型部署上线,用户反馈很好,访问量开始稳步增长。突然,某个营销…...

DAMOYOLO-S多场景实战:交通监控、仓储盘点、内容审核一体化方案

DAMOYOLO-S多场景实战:交通监控、仓储盘点、内容审核一体化方案 1. 引言:一个模型,搞定多种“找东西”的难题 你有没有遇到过这些麻烦事? 在几百小时的交通监控录像里,想快速找出所有违规停车的车辆。仓库里货品成千…...

AgentCPM研报助手:离线环境下的高效解决方案,保护数据隐私安全

AgentCPM研报助手:离线环境下的高效解决方案,保护数据隐私安全 1. 为什么需要离线研报生成工具 在金融分析、政策研究和商业咨询领域,研究报告的撰写往往面临两大核心挑战:一是处理敏感数据时的隐私安全问题,二是高强…...

OpenClaw配置备份指南:百川2-13B-4bits量化版环境迁移技巧

OpenClaw配置备份指南:百川2-13B-4bits量化版环境迁移技巧 1. 为什么需要专门备份OpenClaw配置 上周我的主力开发机突然硬盘故障,导致所有数据丢失。最让我痛心的不是代码仓库——它们都有远程备份,而是那套精心调校的OpenClaw自动化环境。…...

GLM-OCR惊艳效果:竖排+横排混排古籍OCR→自动方向判断+阅读顺序重建

GLM-OCR惊艳效果:竖排横排混排古籍OCR→自动方向判断阅读顺序重建 1. 项目概述与核心能力 GLM-OCR是一个专门为复杂文档理解设计的高性能多模态OCR模型,基于先进的GLM-V编码器-解码器架构构建。这个模型在处理古籍文档时表现出色,特别是能够…...

5分钟部署Llama-3.2-3B:Ollama一键安装,新手快速上手教程

5分钟部署Llama-3.2-3B:Ollama一键安装,新手快速上手教程 1. 为什么选择Llama-3.2-3B? Llama-3.2-3B是Meta公司推出的轻量级大语言模型,专为边缘设备和日常办公场景优化。相比其他大模型,它有三大核心优势&#xff1…...

无需代码基础:MogFace高精度人脸检测可视化工具快速上手

无需代码基础:MogFace高精度人脸检测可视化工具快速上手 1. 工具简介:零门槛的人脸检测神器 想象一下这样的场景:你刚拍完一张集体照,想知道照片里有多少人;或者你需要从监控视频中快速找出特定人物。传统方法要么需…...

Pybind11实战:轻松实现Python与C++的无缝交互

1. Pybind11 是什么? 想象你正在开发一个Python项目,突然遇到性能瓶颈——某个核心算法用Python实现太慢了。这时候你可能会想:"要是能用C重写这部分代码就好了,但又不希望完全抛弃Python的灵活性"。Pybind11就是为解决…...

Qwen3-4B-Thinking多场景落地:医疗IT系统自然语言转HL7/FHIR指令

Qwen3-4B-Thinking多场景落地:医疗IT系统自然语言转HL7/FHIR指令 1. 引言:当医生说话,系统能听懂吗? 想象一下这个场景:一位医生在查房时,对身边的护士说:“给3床的李明开个血常规&#xff0c…...

Tao-8k代码解释与教学:针对C语言基础知识的智能辅导

Tao-8k代码解释与教学:针对C语言基础知识的智能辅导 最近在辅导几个朋友学习C语言,发现一个挺普遍的问题:很多初学者卡在指针、内存管理这些概念上,看教材觉得懂了,一写代码就懵。传统的学习方式要么是看书&#xff0…...

参数调优心得:Anything to RealCharacters提示词这样写,真人化效果更自然

参数调优心得:Anything to RealCharacters提示词这样写,真人化效果更自然 1. 理解提示词在2.5D转真人中的核心作用 当使用Anything to RealCharacters进行图像转换时,提示词(Prompt)就像是一位专业摄影师的"拍摄…...

Fish Speech 1.5语音克隆安全边界:防滥用机制与伦理使用建议

Fish Speech 1.5语音克隆安全边界:防滥用机制与伦理使用建议 你有没有想过,如果有一天,你的声音可以被任何人轻易复制,会发生什么?想象一下,有人用你的声音给家人打电话借钱,或者用你老板的声音…...

PHP使用PHPExcel读取excel数据并批量上传到数据库

要求PHP 5.2.0 版本及以上PHP extension php_zip 开启 (如果你需要使用 PHPExcel 来操作 .xlsx .ods or .gnumeric 文件)PHP extension php_xml 开启PHP extension php_gd2 开启(选填, 如果需要计算准确的列宽需要开启此扩展)PHP 读取文件写入数据库12345678910111213141516171…...

NEURAL MASK 社区贡献指南:如何向开源项目提交代码与模型

NEURAL MASK 社区贡献指南:如何向开源项目提交代码与模型 你是不是也对 NEURAL MASK 这个项目很感兴趣,想贡献自己的一份力量,但又不知道从何下手?别担心,今天这篇指南就是为你准备的。参与开源项目听起来很高大上&am…...

PHP关键字Self、Static和parent的区别详解

在使用PHP代码时,您可能经常会遇到parent::、static::和self::。但是当你第一次作为一个开发人员开始的时候,有时候你会很困惑,不知道它们是做什么的,以及它们之间的区别。在我第一次作为开发人员开始工作后的很长一段时间里&…...

网站标题优化对SEO排名的影响是什么

网站标题优化对SEO排名的影响是什么 在当今的互联网时代,网站的排名直接影响到其流量和转化率。搜索引擎优化(SEO)是提升网站排名的关键手段之一,而网站标题优化在整个SEO策略中占据重要地位。网站标题优化对SEO排名的影响究竟有…...

OpenClaw镜像体验:Qwen3.5-9B云端沙盒快速入门

OpenClaw镜像体验:Qwen3.5-9B云端沙盒快速入门 1. 为什么选择云端沙盒体验OpenClaw? 第一次接触OpenClaw时,我被它"本地AI智能体"的定位所吸引——一个能在我的电脑上自动执行各种任务的开源框架。但当我真正开始尝试本地部署时&…...

丹青幻境完整使用流程:从铺陈画纸到揭榜留存,一步不漏

丹青幻境完整使用流程:从铺陈画纸到揭榜留存,一步不漏 1. 走进丹青幻境 "见微知著,凝光成影。执笔入画,神游万象。"丹青幻境是一款基于Z-Image架构与Cosplay LoRA技术打造的数字艺术创作工具。它将现代AI算力与传统水…...

STM32串口IAP实现与固件远程更新指南

1. STM32串口IAP实现原理与实战指南IAP(In Application Programming)技术是嵌入式开发中一项非常实用的功能,它允许我们在产品发布后通过预留的通信接口对固件进行远程更新。作为一名嵌入式开发者,我曾在多个工业项目中成功应用串…...