You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Matplotlib实现牛顿-拉夫逊迭代过程动画的方法

实现思路与代码示例

核心逻辑

  • 主曲线仅在初始化时绘制一次,全程不做修改,确保始终保留
  • 垂直线、切线作为动态元素,通过修改现有线条的数据实现更新,无需删除重建

完整可运行代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 准备曲线数据
x = np.linspace(0, 2*np.pi, 1000)
y = np.sin(x)

# 创建画布与坐标轴
fig, ax = plt.subplots(figsize=(8, 5))
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1.2, 1.2)
ax.set_xlabel('x')
ax.set_ylabel('sin(x)')

# 绘制静态主曲线(仅执行一次)
main_line, = ax.plot(x, y, color='#1f77b4', linewidth=2)

# 初始化动态元素:垂直线、切线(初始为空)
v_line, = ax.plot([], [], color='#ff4b4b', linestyle='--', linewidth=1)
tangent_line, = ax.plot([], [], color='#2ca02c', linewidth=2)

# 动画初始化函数:设置动态元素初始状态
def init():
    v_line.set_data([], [])
    tangent_line.set_data([], [])
    return v_line, tangent_line

# 帧更新函数:逐帧修改动态元素的数据
def update(frame):
    x0 = x[frame]
    y0 = np.sin(x0)
    
    # 更新垂直线:x固定为x0,y从0到sin(x0)
    v_line.set_data([x0, x0], [0, y0])
    
    # 计算切线斜率与方程,取x0附近区间展示
    slope = np.cos(x0)
    tangent_x = np.array([x0 - 0.5, x0 + 0.5])
    tangent_y = slope*(tangent_x - x0) + y0
    tangent_line.set_data(tangent_x, tangent_y)
    
    return v_line, tangent_line

# 创建并运行动画
ani = FuncAnimation(fig, update, frames=len(x), init_func=init, interval=20, blit=True)

plt.show()

关键细节说明

  • 静态/动态元素分离:主曲线main_line只绘制一次,动画过程中不会被修改,自然保留在画面中
  • 高效更新方式:用set_data()直接修改线条的x、y数据,是Matplotlib动画最优的更新逻辑,避免频繁创建/删除元素的性能损耗
  • blit=True:仅更新画面中变化的部分(垂直线、切线),大幅提升动画流畅度
  • 帧率控制:interval参数(单位毫秒)控制每帧间隔,frames参数指定总帧数,可根据需求调整

常见问题排查

  • 若动画元素闪烁/不更新:确保update函数返回的是动态元素元组(注意末尾逗号,比如return v_line, tangent_line)
  • 若切线显示过短/过长:调整tangent_x的区间范围(比如把0.5改成1)

内容的提问来源于stack exchange,提问作者Soham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:09:22