切线与切平面的可视化

切线与切平面的可视化

flyfish

切线的可视化

py 复制代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter

# 定义一个简单的一元函数,例如 f(x) = x^2
def func(x):
    return x**2

# 计算函数的导数
def derivative(x):
    return 2 * x

# 设置x的范围
x = np.linspace(-3, 3, 400)
y = func(x)

# 创建图形和轴
fig, ax = plt.subplots()
ax.plot(x, y, 'b', label='f(x) = x^2')
tangent_line, = ax.plot([], [], 'r--', label="Tangent line")  # 切线
point, = ax.plot([], [], 'ro')  # 用于显示切点

# 设置图形的范围
ax.set_xlim(-3, 3)
ax.set_ylim(-1, 10)
ax.legend()

# 初始化函数
def init():
    tangent_line.set_data([], [])
    point.set_data([], [])
    return tangent_line, point

# 更新函数,用于动画
def update(frame):
    x_val = frame / 20.0 - 1.5  # 随时间移动的x值
    
    # 计算切线的点
    y_val = func(x_val)
    slope = derivative(x_val)
    tangent_x = np.linspace(x_val - 1, x_val + 1, 100)
    tangent_y = slope * (tangent_x - x_val) + y_val
    
    # 更新切线和点的位置
    tangent_line.set_data(tangent_x, tangent_y)
    point.set_data([x_val], [y_val])
    
    return tangent_line, point

# 创建动画
ani = FuncAnimation(fig, update, frames=np.arange(0, 120), init_func=init, interval=100, blit=True)

# 保存动画为GIF文件
writer = PillowWriter(fps=10)
ani.save("derivative_animation.gif", writer=writer)

# 显示动画
plt.show()

切平面的可视化

py 复制代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import imageio

# 定义二元函数
def f(x, y):
    return x**2 + y**2

# 定义切平面
def tangent_plane(x, y, x0, y0, z0, a, b):
    return z0 + a * (x - x0) + b * (y - y0)

# 计算二元函数的梯度
def gradient(x, y):
    fx = 2 * x
    fy = 2 * y
    return fx, fy

# 设置网格
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
z = f(x, y)

# 选择切平面的点
x0, y0 = 2, 2
z0 = f(x0, y0)
fx, fy = gradient(x0, y0)

# 创建动画
filenames = []
for angle in range(0, 360, 5):
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.plot_surface(x, y, z, cmap='viridis', alpha=0.7)
    
    # 画切平面
    z_plane = tangent_plane(x, y, x0, y0, z0, fx, fy)
    ax.plot_surface(x, y, z_plane, color='r', alpha=0.5)
    
    # 标记切点
    ax.scatter(x0, y0, z0, color='r', s=50)
    
    # 设置视角
    ax.view_init(elev=20., azim=angle)
    
    # 保存当前帧
    filename = f'_tmp{angle}.png'
    plt.savefig(filename)
    filenames.append(filename)
    plt.close()

# 创建GIF
with imageio.get_writer('tangent_plane_animation.gif', mode='I', duration=0.1,loop=0) as writer:
    for filename in filenames:
        image = imageio.imread(filename)
        writer.append_data(image)

# 清理临时文件
import os
for filename in filenames:
    os.remove(filename)
相关推荐
七芒星202315 小时前
多目标识别YOLO :YOLOV3 原理
图像处理·人工智能·yolo·计算机视觉·目标跟踪·分类·聚类
深瞳智检18 小时前
YOLO算法原理详解系列 第007期-YOLOv7 算法原理详解
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
Evand J1 天前
组合导航的MATLAB例程,二维平面上的CKF滤波,融合IMU和GNSS数据,仿真,观测为X和Y轴的坐标,附代码下载链接
开发语言·matlab·平面·imu·组合导航
bubiyoushang8887 天前
雷达目标跟踪中扩展卡尔曼滤波(EKF)算法matlab实现
算法·matlab·目标跟踪
wuk9989 天前
MATLAB的CFAR(恒虚警率)图像目标检测
目标检测·matlab·目标跟踪
没有不重的名么13 天前
DanceTrack数据集介绍
人工智能·计算机视觉·目标跟踪
算法打盹中13 天前
计算机视觉:安防智能体的实现与应用基于YOLOv8的实时无人机检测与跟踪
图像处理·yolo·计算机视觉·目标跟踪·无人机·目标识别
jndingxin13 天前
算法面试(5)------NMS(非极大值抑制)原理 Soft-NMS、DIoU-NMS 是什么?
人工智能·算法·目标跟踪
神仙别闹14 天前
基于 Python 模式识别(纹理图片里的目标检测)
python·目标检测·目标跟踪
Xvisio诠视科技24 天前
超越平面交互:SLAM技术如何驱动MR迈向空间计算时代?诠视科技以算法引领变革
平面·mr·空间计算