如何在Python中绘制根式方程?含三元根式方程绘图需求
直接绘制根式方程图像的方法与Python库推荐
方法一:隐式函数绘图(无需消元)
直接用支持隐式方程绘图的工具,跳过消根号的步骤,从根源上避免增根问题。matplotlib结合numpy就能实现,核心是生成网格点代入方程,筛选满足条件的点绘制曲线。
示例代码
import numpy as np import matplotlib.pyplot as plt # 替换成你的实际参数 X1, Y1 = 0, 0 X2, Y2 = 2, 0 X3, Y3 = 1, 2 t1, t2, t3 = 1, 1, 1 S = 3 # 定义你的三个根式方程(根据实际形式修改) def eq1(x, y): return np.sqrt((x - X1)**2 + (y - Y1)**2) + t1 * np.sqrt((x - X2)**2 + (y - Y2)**2) - S def eq2(x, y): return np.sqrt((x - X1)**2 + (y - Y1)**2) + t2 * np.sqrt((x - X3)**2 + (y - Y3)**2) - S def eq3(x, y): return np.sqrt((x - X2)**2 + (y - Y2)**2) + t3 * np.sqrt((x - X3)**2 + (y - Y3)**2) - S # 生成绘图网格 x_range = np.linspace(-5, 5, 1000) y_range = np.linspace(-5, 5, 1000) X, Y = np.meshgrid(x_range, y_range) # 绘制曲线 plt.figure(figsize=(8,8)) plt.contour(X, Y, eq1(X,Y), levels=[0], colors='r', label='方程1') plt.contour(X, Y, eq2(X,Y), levels=[0], colors='g', label='方程2') plt.contour(X, Y, eq3(X,Y), levels=[0], colors='b', label='方程3') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.grid(True) plt.show()
这种方式直接保留根式原形式,不会引入额外解,省去手动筛选的麻烦。
方法二:SymPy符号化绘图
如果需要更精准的符号级绘图,用SymPy的plot_implicit函数,它会自动处理根式的定义域(比如根号内非负),只绘制有意义的曲线部分。
示例代码
from sympy import symbols, sqrt, plot_implicit x, y = symbols('x y') # 代入参数定义符号方程 eq1 = sqrt((x - X1)**2 + (y - Y1)**2) + t1*sqrt((x - X2)**2 + (y - Y2)**2) - S eq2 = sqrt((x - X1)**2 + (y - Y1)**2) + t2*sqrt((x - X3)**2 + (y - Y3)**2) - S eq3 = sqrt((x - X2)**2 + (y - Y2)**2) + t3*sqrt((x - X3)**2 + (y - Y3)**2) - S # 合并绘图 p1 = plot_implicit(eq1, (x, -5, 5), (y, -5, 5), line_color='red', show=False) p2 = plot_implicit(eq2, (x, -5, 5), (y, -5, 5), line_color='green', show=False) p3 = plot_implicit(eq3, (x, -5, 5), (y, -5, 5), line_color='blue', show=False) p1.extend(p2) p1.extend(p3) p1.show()
实用提示
- 调整网格范围:如果曲线不在当前区间,扩大
linspace的取值范围即可;增加点数能让曲线更平滑,但会增加计算量。 - 误差控制:用
contour时,若因浮点数计算出现曲线断裂,可把levels设为[-1e-6, 1e-6]来允许微小误差。 - 定义域处理:numpy版本可提前筛选网格点,避免根号内为负的情况,减少复数警告。
内容的提问来源于stack exchange,提问作者Narsimha Reddy
相关产品推荐
相关产品推荐

