如何在Manim中求解并绘制两个函数图像的交点坐标
Manim两个函数图像交点的通用获取方法
有两种可覆盖绝大多数场景的实现方案:
- 方案1:直接调用Manim内置的交点查找方法
get_graph生成的图像属于VMobject类,自带find_intersection方法,可以直接计算两个图像的交点,不需要额外引入依赖,使用最简单:
# 计算两个图像的所有交点,返回值为场景坐标下的点列表 intersections = g1.find_intersection(g2) # 若需要转换为坐标轴的数值坐标,调用axes的转换方法即可 for point in intersections: x_val, y_val = axes.point_to_coords(point) # 可直接在此处生成Dot标记交点 self.add(Dot(point, color=YELLOW))
注意:如果遇到交点精度不足、漏识别的情况,可以在生成图像时增加采样点数量,例如:
g1 = axes.get_graph(lambda x: f(x), color=RED, x_range=[0,3], num_sampling_points=200)
采样点数量越高,交点识别精度越高。
- 方案2:通过数值求解方程获取交点
如果需要提前获取交点的数值坐标、或者对精度要求极高,可以通过求解方程f(x) = g(x)得到交点坐标:
import numpy as np from scipy.optimize import root_scalar # 构造差值函数,求根即对应f(x)=g(x)的解 def h(x): return f(x) - g(x) roots = [] # 遍历x区间检测符号变化,定位所有根的位置 x_samples = np.linspace(0, 3, 100) for i in range(len(x_samples)-1): a, b = x_samples[i], x_samples[i+1] if h(a) * h(b) <= 0: sol = root_scalar(h, bracket=[a, b], method="bisect") if sol.converged and not any(abs(sol.root - r) < 1e-6 for r in roots): roots.append(sol.root) # 转换为场景坐标并绘制交点 for x_root in roots: y_root = f(x_root) point = axes.coords_to_point(x_root, y_root) self.add(Dot(point, color=YELLOW))
两种方案都可以适配任意可调用的f、g函数,方案1适合快速绘图场景,方案2适合需要对交点数值做二次处理的场景。
内容的提问来源于stack exchange,提问作者evethompson123
相关产品推荐
相关产品推荐

