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

从一根琴弦到万物波动:用Python和NumPy手把手复现Fourier级数的诞生过程

从一根琴弦到万物波动用Python和NumPy手把手复现Fourier级数的诞生过程当18世纪的数学家们争论不连续函数能否用三角级数表示时他们或许想象不到两个世纪后的开发者只需几行代码就能可视化这个革命性思想。本文将带您穿越时空用Python重现Fourier从琴弦振动到热传导研究的探索之路——不是通过抽象公式推导而是借助可交互的代码实验。1. 准备历史实验室我们需要搭建一个兼具数学严谨性和代码灵活性的实验环境。与19世纪的学者不同我们的演算纸是Jupyter Notebook计算工具是NumPy的向量化运算import numpy as np import matplotlib.pyplot as plt from ipywidgets import interact plt.style.use(seaborn-whitegrid) # 配置高清显示 %config InlineBackend.figure_format retina关键工具链选择NumPy处理大规模数组运算对应Fourier时代的离散质点近似Matplotlib实现动态可视化替代Fourier手绘的波形图SciPy提供特殊函数支持相当于19世纪的函数表注意所有代码示例都设计为可独立运行建议边阅读边在Colab或本地环境中复现2. 振动弦的物理建模2.1 简谐运动音乐中的基本粒子Fourier研究的起点是简谐运动——琴弦上每个质点的微观行为。让我们用微分方程和动画还原这个基础模型def harmonic_oscillator(t, A1, c2, phi0): 简谐振荡器位移函数 return A * np.cos(c * t - phi) t np.linspace(0, 10, 500) y harmonic_oscillator(t) plt.figure(figsize(10,4)) plt.plot(t, y, colorsteelblue) plt.title(简谐运动: $y(t) A\cos(ct-\phi)$, fontsize14) plt.xlabel(时间 t, fontsize12) plt.ylabel(位移 y, fontsize12);参数实验改变A观察振幅对波形的影响调整c体验频率与音高的关系修改phi理解相位差的物理意义2.2 从离散质点到连续弦Fourier的突破在于将无数个简谐振荡器耦合起来。我们先构建一个20质点的简化模型N 20 # 质点数量 L np.pi # 弦长度 positions np.linspace(0, L, N) # 初始位移在xπ/2处拨动 initial_displacement np.where(positions np.pi/2, positions, np.pi - positions)用有限差分法近似波动方程def wave_equation_step(u, c1, dt0.01): 波动方程单步迭代 new_u np.zeros_like(u) # 内部质点更新忽略边界固定点 for i in range(1, len(u)-1): new_u[i] 2*u[i] - u_prev[i] (c*dt)**2 * (u[i1] - 2*u[i] u[i-1]) return new_u3. 波动方程的可视化解3.1 行波dAlembert的解法1747年dAlembert提出用行波函数表示解。我们用NumPy实现这个优雅的方案def dAlembert_solution(x, t, c1): 达朗贝尔行波解 def f(x): # 三角初始条件 return np.where((x 0) (x np.pi), np.where(x np.pi/2, x, np.pi - x), 0) # 奇延拓周期延拓 x_mod x % (2*np.pi) x_mod np.where(x_mod np.pi, 2*np.pi - x_mod, x_mod) return 0.5 * (f(x_mod c*t) f(x_mod - c*t)) # 创建交互式可视化 interact(t(0, 10, 0.1)) def plot_wave(t0): x np.linspace(-np.pi, 2*np.pi, 500) plt.figure(figsize(10,4)) plt.plot(x, dAlembert_solution(x, t)) plt.ylim(-0.5, 1.5) plt.title(ft {t:.1f}时的行波解);3.2 驻波叠加Fourier的革命性思想Fourier的突破在于用无限多个驻波表示解。我们实现这个关键思路def fourier_series(x, t, terms10): 有限项Fourier级数解 result np.zeros_like(x) for n in range(1, terms1): # 计算第n项系数 if n % 2 1: # 只有奇次谐波 A_n 4*(-1)**((n-1)//2) / (np.pi * n**2) else: A_n 0 result A_n * np.cos(n*t) * np.sin(n*x) return result # 对比不同谐波数量的近似效果 x np.linspace(0, np.pi, 200) plt.figure(figsize(10,4)) for terms in [1, 5, 20, 100]: plt.plot(x, fourier_series(x, 0, terms), labelf{terms}项) plt.legend(title谐波数量);4. 从振动到热传导4.1 热方程Fourier的第二战场1807年Fourier将类似方法应用于热传导。我们用有限差分法模拟这个扩散过程def heat_equation_step(u, alpha0.1, dx0.1): 热传导方程单步迭代 new_u u.copy() new_u[1:-1] u[1:-1] alpha * (u[:-2] - 2*u[1:-1] u[2:]) return new_u # 初始条件中点热源 u np.zeros(100) u[45:55] 1 # 时间演化 plt.figure(figsize(10,5)) for t in range(0, 500, 50): for _ in range(50): u heat_equation_step(u) plt.plot(u, labelft{t*50}) plt.title(热传导方程的数值解);4.2 圆盘上的温度分布Fourier研究的最复杂情形是圆盘稳态温度分布。我们用极坐标网格计算theta np.linspace(0, 2*np.pi, 100) r np.linspace(0, 1, 50) T, R np.meshgrid(theta, r) # 边界条件cos(2θ)温度分布 boundary np.cos(2*T[-1,:]) # 解拉普拉斯方程 def laplace_solution(R, T, boundary): solution np.zeros_like(R) for n in range(1, 5): # 取前4个谐波 solution (R**n) * (np.cos(n*T) * np.cos(n*np.pi/4)) return solution Z laplace_solution(R, T, boundary) # 3D可视化 from mpl_toolkits.mplot3d import Axes3D fig plt.figure(figsize(10,7)) ax fig.add_subplot(111, projection3d) ax.plot_surface(R*np.cos(T), R*np.sin(T), Z, cmapcoolwarm);5. 现代视角下的Fourier分析5.1 快速Fourier变换实践1965年Cooley-Tukey算法彻底改变了Fourier分析的应用方式from scipy.fft import fft, fftfreq # 生成含噪声信号 t np.linspace(0, 1, 1000) signal (np.sin(2*np.pi*10*t) 0.5*np.sin(2*np.pi*25*t) 0.2*np.random.randn(len(t))) # FFT分析 yf fft(signal) xf fftfreq(len(t), t[1]-t[0]) plt.figure(figsize(10,4)) plt.plot(xf[:len(xf)//2], np.abs(yf[:len(yf)//2])) plt.title(信号频谱分析);5.2 时频分析Fourier的现代延伸from scipy.signal import spectrogram f, t, Sxx spectrogram(signal, fs1000) plt.figure(figsize(10,4)) plt.pcolormesh(t, f, 10*np.log10(Sxx), shadinggouraud) plt.colorbar(label强度 (dB)) plt.title(时频分析谱图);6. 从数学争议到数字革命Fourier的原始手稿曾被巴黎科学院拒绝理由是缺乏严格性。今天我们却能通过几行代码验证他的直觉def gibbs_phenomenon(terms50): 展示Gibbs现象 x np.linspace(-np.pi, np.pi, 1000) f np.zeros_like(x) for n in range(1, terms1): f (4/np.pi) * np.sin((2*n-1)*x)/(2*n-1) plt.figure(figsize(10,4)) plt.plot(x, f, labelf{terms}项) plt.plot(x, np.sign(x), k--, label方波) plt.legend() gibbs_phenomenon(100) # 观察过冲现象这段代码展示的Gibbs现象正是当年数学家们质疑的焦点——不连续点附近的振荡。现代分析表明这恰恰揭示了Fourier级数收敛的本质特征。

相关文章:

从一根琴弦到万物波动:用Python和NumPy手把手复现Fourier级数的诞生过程

从一根琴弦到万物波动:用Python和NumPy手把手复现Fourier级数的诞生过程 当18世纪的数学家们争论"不连续函数能否用三角级数表示"时,他们或许想象不到两个世纪后的开发者只需几行代码就能可视化这个革命性思想。本文将带您穿越时空&#xff0c…...

组合优化中的在线学习算法:Exp3与FTRL详解

1. 组合优化中的在线学习算法概述组合优化问题在计算机科学和运筹学中无处不在,从经典的旅行商问题(TSP)到背包问题,再到资源分配和调度问题。这类问题的共同特点是需要在离散的、通常是巨大的解空间中寻找最优或近似最优的解。传统方法如动态规划、分支…...

通达信VOL实战监测:一个能替代成交量指标的源码,手把手教你安装与解读

通达信VOL指标深度解析:从源码安装到实战应用全指南 在股票技术分析领域,成交量指标(VOL)一直被视为价格变动的重要验证工具。传统成交量指标虽然直观,但缺乏对市场情绪的分级判断。今天我们要探讨的这套通达信VOL增强指标,通过换…...

Windows蓝屏0xE6?别慌!手把手教你用WinDbg定位DRIVER_VERIFIER_DMA_VIOLATION元凶(以NVIDIA显卡驱动为例)

Windows蓝屏0xE6故障排查:用WinDbg精准定位DRIVER_VERIFIER_DMA_VIOLATION问题 当你正专注于重要工作时,屏幕突然蓝屏并显示"DRIVER_VERIFIER_DMA_VIOLATION (0xE6)"错误代码,这种经历足以让任何Windows用户感到沮丧。这种错误通常…...

观察 Taotoken 在多模型聚合调用下的路由稳定性与响应表现

观察 Taotoken 在多模型聚合调用下的路由稳定性与响应表现 1. 测试环境与配置 本次测试基于 Taotoken 平台的标准 API 接入环境,使用 Python SDK 进行多模型调用。在控制台配置了三个不同供应商的模型作为备用路由选项,模型选择策略设置为自动模式。测…...

观察 Taotoken 按 Token 计费模式下的成本控制效果

观察 Taotoken 按 Token 计费模式下的成本控制效果 1. 项目背景与计费需求 在涉及大模型调用的项目中,成本控制一直是团队管理者关注的核心问题。传统按次或包月计费模式往往难以精确匹配实际使用量,容易造成资源浪费或预算超支。我们团队近期接入了 T…...

DROID-SLAM的“可微分BA层”到底强在哪?深入拆解RAFT与LieTorch的协同设计

DROID-SLAM的可微分BA层技术解析:RAFT与LieTorch的协同创新 视觉SLAM领域近年来最引人注目的突破之一,莫过于深度学习与传统几何方法的深度融合。DROID-SLAM作为这一交叉领域的代表性工作,其核心创新点——可微分稠密束调整(DBA&a…...

用AT32F437的QSPI给项目扩容:手把手实现华邦W25N01G NAND Flash的文件系统移植

AT32F437 QSPI扩展实战:W25N01G NAND Flash文件系统深度整合指南 在嵌入式系统开发中,存储扩展一直是提升设备能力的关键路径。当AT32F437这类高性能MCU遇到1Gb大容量NAND Flash时,如何突破基础驱动层面,实现稳定可靠的文件系统支…...

对比直接使用厂商API体验Taotoken在路由容灾上的便利

服务波动下的无缝切换:Taotoken 路由容灾实践观察 1. 背景与问题场景 在实际开发过程中,依赖单一模型供应商的 API 服务存在潜在风险。当供应商出现临时性服务波动或区域性故障时,传统解决方案通常需要开发者手动切换 API 端点或模型&#…...

《图灵完备》迷宫机器人避坑指南:为什么‘右手扶墙’算法会失效?以及如何用汇编实现它

《图灵完备》迷宫机器人避坑指南:从算法失效到汇编实战 当你第一次在《图灵完备》的迷宫关卡中尝试"右手扶墙"算法时,可能会惊讶地发现这个经典方法在某些情况下会彻底失效。这不是算法的错,而是游戏机制与真实世界物理规则的微妙差…...

Cadence IC617下tsmc18rf与tsmcN65工艺库安装避坑全记录(附转换失败备用包)

Cadence IC617工艺库安装实战:从CDB-OA转换失败到应急方案全解析 在半导体设计领域,工艺库的安装是每位工程师必须掌握的基础技能。当面对Cadence IC617环境下tsmc18rf与tsmcN65工艺库的安装时,许多用户会发现即使严格遵循教程步骤&#xff0…...

告别电源纹波!手把手教你用UCC28019设计一个高效率PFC模块(附完整原理图与BOM清单)

告别电源纹波!手把手教你用UCC28019设计一个高效率PFC模块(附完整原理图与BOM清单) 在中小功率开关电源设计中,功率因数校正(PFC)模块的性能直接影响整个系统的效率和稳定性。传统设计往往面临纹波大、动态…...

实战指南:构建智能缠论量化分析的高效开源方案

实战指南:构建智能缠论量化分析的高效开源方案 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 你是否厌倦了手动绘制缠论线段和中枢的繁琐过程?CZSC.dll开源缠论量化插件通过先进…...

ROS导航调参实战:如何让你的TurtleBot3在复杂办公室环境里不撞墙?

ROS导航调参实战:TurtleBot3复杂环境避障优化指南 在机器人导航领域,ROS的move_base功能包提供了强大的路径规划能力,但默认参数往往难以应对真实场景中的复杂环境。当你的TurtleBot3在办公室走廊频繁撞墙、在U型转弯处卡住、或对动态障碍反应…...

2025届毕业生推荐的五大AI论文工具推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要降低文章里人工智能生成的那种痕迹,得从词汇的挑选、句式的构造以及逻辑的连贯…...

芯片版图设计避坑指南:那些藏在Metal走线里的寄生电容,我是这样处理的

芯片版图设计避坑指南:那些藏在Metal走线里的寄生电容,我是这样处理的 在芯片设计的微观世界里,版图工程师的每一个决策都可能引发蝴蝶效应。记得第一次独立负责高速SerDes模块时,我在Metal6层精心布置的差分对信号线,…...

从手机到汽车:拆解AFE芯片ADBMS6832,看电池安全监控如何进化

从手机到汽车:拆解AFE芯片ADBMS6832,看电池安全监控如何进化 你是否曾在寒冬中掏出手机,却发现电量从50%瞬间归零自动关机?或是驾驶电动车时,明明电量充足却遭遇加速无力的窘境?这些现象背后,隐…...

AI模型选型实战:基于开源工具llmarena.ai的成本与性能对比

1. 项目概述:一个为开发者而生的AI模型比价与选型工具在AI应用开发这个行当里摸爬滚打了几年,我最大的感触就是“选择困难症”越来越严重了。早些年,大家基本就盯着OpenAI的API,GPT-3.5够用,GPT-4更强,没太…...

别再复制粘贴了!解决Maven+Jacoco不生成.exec文件的正确姿势(附完整POM配置)

MavenJacoco覆盖率报告生成实战:从原理到配置的完整避坑指南 最近在团队内部做代码质量审计时,发现一个有趣的现象:超过60%的Java项目虽然配置了Jacoco覆盖率检测,但实际并未正确生成.exec数据文件。更令人惊讶的是,大…...

同济线代第七版笔记:从期末突击到AI应用,我的矩阵恐惧症治愈之路

同济线代第七版笔记:从期末突击到AI应用,我的矩阵恐惧症治愈之路 第一次翻开同济版《线性代数》时,那些密密麻麻的矩阵和行列式就像天书符号。直到在机器学习课程中看到反向传播算法的推导过程,我才突然意识到——原来这些"吓…...

如何快速修复损坏二维码:QrazyBox像素级数据恢复实战指南

如何快速修复损坏二维码:QrazyBox像素级数据恢复实战指南 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经遇到过这样的困境?一张重要的会议二维码因为打印模…...

终极指南:如何用GI-Model-Importer轻松自定义原神角色模型

终极指南:如何用GI-Model-Importer轻松自定义原神角色模型 【免费下载链接】GI-Model-Importer Tools and instructions for importing custom models into a certain anime game 项目地址: https://gitcode.com/gh_mirrors/gi/GI-Model-Importer GI-Model-I…...

从图像分类到CTR预估:手把手拆解SENET模块在FiBiNet中的迁移与应用

从图像分类到CTR预估:SENET模块在FiBiNet中的跨领域迁移实践 在深度学习领域,模块复用和跨领域迁移正成为提升模型性能的重要范式。计算机视觉中的SENET(Squeeze-and-Excitation Network)模块通过动态调整通道注意力,显…...

SeeUPO算法:无Critic强化学习在序列决策中的应用

1. 算法背景与核心价值在序列决策任务中,强化学习算法通常面临两个关键挑战:一是需要大量人工设计的奖励函数(Critic)来指导模型训练,二是缺乏理论上的收敛性保证。SeeUPO算法的提出正是为了解决这两个痛点。传统强化学…...

STM32 PID温控终极指南:从零到精通的5个实战技巧

STM32 PID温控终极指南:从零到精通的5个实战技巧 【免费下载链接】STM32 项目地址: https://gitcode.com/gh_mirrors/stm322/STM32 想要实现0.5C的高精度温度控制吗?STM32微控制器结合PID算法就是你的终极解决方案!无论你是嵌入式开发…...

NVIDIA Profile Inspector深度配置指南:解锁30%游戏性能提升与5大高级优化方案

NVIDIA Profile Inspector深度配置指南:解锁30%游戏性能提升与5大高级优化方案 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专为技术爱好者和高级用户设计…...

别再只会用A*了!用Python手搓JPS算法,让你的游戏寻路效率翻倍(附完整代码)

用Python实现JPS算法:游戏寻路性能优化的终极指南 在开发2D网格类游戏时,NPC寻路效率直接影响游戏体验。传统A*算法虽然可靠,但在复杂地图中性能堪忧。本文将带你深入理解Jump Point Search(JPS)算法,并用Python实现一个完整解决方…...

RPG-Maker游戏资源解密:专业网页工具终极指南

RPG-Maker游戏资源解密:专业网页工具终极指南 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https://gitcode.com/gh_…...

英雄联盟智能助手:5大核心功能提升你的游戏体验

英雄联盟智能助手:5大核心功能提升你的游戏体验 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款基于官方LCU API开发的智能游戏辅助工具,专为英雄联盟玩家设计。这款自…...

OpenClaw技能开发:集成德国NINA预警API的轻量级命令行工具

1. 项目概述:一个为OpenClaw定制的德国公共预警信息查询技能 如果你和我一样,是一个喜欢折腾自动化工具,并且对获取本地关键信息(比如灾害预警)有需求的开发者,那么你很可能听说过或者正在使用OpenClaw。它…...