切线与切平面的可视化
flyfish
切线的可视化
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()
切平面的可视化
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 * xfy = 2 * yreturn 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)