切线与切平面的可视化

切线与切平面的可视化

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)
相关推荐
Evand J19 小时前
集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码
matlab·平面·目标跟踪
东芝、铠侠总代1361006839321 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面
菠菠萝宝1 天前
【YOLOv8】安卓端部署-1-项目介绍
android·java·c++·yolo·目标检测·目标跟踪·kotlin
CSBLOG5 天前
Day14 - CV项目实战:SAR飞机检测识别
人工智能·计算机视觉·目标跟踪
夏日的盒盒5 天前
《DiffusionDet: Diffusion Model for Object Detection》ICCV2023
人工智能·目标检测·目标跟踪
Evand J6 天前
【TDOA最小二乘解算】两步最小二乘迭代的TDOA解算方法,适用于二维平面、自适应锚点(附MATLAB代码)
数据库·matlab·平面
幽络源小助理6 天前
桥梁缺陷YOLO免费数据集分享 – 6308张已标注8类缺陷图像
人工智能·计算机视觉·目标跟踪
浮生如梦_7 天前
Halcon 3D平面度
图像处理·算法·计算机视觉·平面·视觉检测
Deepcong8 天前
世界坐标系、相机坐标系、图像物理坐标系、像素平面坐标系
数码相机·平面
晚点吧8 天前
视频横屏转竖屏播放-使用人脸识别+目标跟踪实现
人工智能·目标跟踪·音视频