切线与切平面的可视化

切线与切平面的可视化

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)
相关推荐
mahtengdbb15 小时前
RepViT块改进YOLOv26重参数化与双路径特征混合双重突破
人工智能·yolo·目标跟踪
全栈开发圈1 天前
新书速览|机器人系统开发与优化:算法、感知与控制策略
算法·目标跟踪·机器人
mahtengdbb11 天前
P6超大目标检测层改进YOLOv26四尺度特征金字塔与大感受野建模双重突破
yolo·目标检测·目标跟踪
一碗白开水一2 天前
【目标跟踪综述】目标跟踪近3年技术研究,全面了解目标跟踪发展
人工智能·计算机视觉·目标跟踪
Hello world.Joey2 天前
YOLO和SiamFC的不同之处
人工智能·计算机视觉·目标跟踪
Hello world.Joey2 天前
SiamFC概述
人工智能·深度学习·计算机视觉·目标跟踪
QQ676580082 天前
智慧工地要素识别数据集 塔吊挂钩识别数据集 吊物识别数据集 工地人员识别数据集 目标检测识别 工地识别数据集
人工智能·目标检测·目标跟踪·工地要素识别·塔吊挂钩·吊物识别·工地人员识别
Evand J2 天前
【代码介绍】二维平面上的雷达跟踪与UKF(无迹卡尔曼滤波),高精度估计目标轨迹,输出真值、估计值、误差特性等
matlab·平面·雷达·滤波·定位·导航·跟踪
bcbobo21cn2 天前
Three.js绘制三角形网格平面
前端·javascript·平面·三角形面·基础材质
fengfuyao9852 天前
基于遗传算法的分布式电源选址定容优化(考虑环境因素)
算法·matlab·平面