如何在Python中绘制隐函数ax²+bxy+cy²+d=0的图像?
解决二元二次方程f(x,y)=0的绘图问题
你的问题出在没有生成平面网格点,而且误用了适合一维曲线的plt.plot()来处理二维函数。原来的代码里,x和y是独立的一维数组,计算f(x,y)时会被广播成二维矩阵,但plt.plot()无法直接解析这种二维数据来绘制等值线,所以才得到了混乱的一维线条。
下面是两种可行的解决方案,最推荐第一种:
方法一:使用plt.contour绘制等值线(最准确)
这是绘制隐函数f(x,y)=0最直接的方式,通过生成网格点计算函数值,然后提取f(x,y)=0的等值线:
import matplotlib.pyplot as plt import numpy as np def f(x,y): return 0.01*x**2 + 0.008*x*y - 0.013*y**2 + 0.15*x + 0.003*y + 1.0097 # 生成x和y的取值范围 x = np.arange(-10.0, 10.0, 0.1) y = np.arange(-10.0, 10.0, 0.1) # 将一维数组转换为二维网格矩阵,每个(X[i,j], Y[i,j])对应平面上的一个点 X, Y = np.meshgrid(x, y) # 计算每个网格点的函数值 Z = f(X, Y) # 绘制f(x,y)=0的等值线,levels=[0]指定只画值为0的那条线 plt.contour(X, Y, Z, levels=[0], colors='red') # 添加坐标轴标签和标题 plt.xlabel('x') plt.ylabel('y') plt.title('Plot of f(x,y)=0') # 显示图像 plt.show()
方法二:筛选接近0的点绘制(适合快速验证)
如果想通过散点图展示,可以筛选出f(x,y)绝对值小于某个阈值(比如0.01)的点,近似表示f(x,y)=0的曲线:
import matplotlib.pyplot as plt import numpy as np def f(x,y): return 0.01*x**2 + 0.008*x*y - 0.013*y**2 + 0.15*x + 0.003*y + 1.0097 # 生成网格点 x = np.arange(-10.0, 10.0, 0.05) y = np.arange(-10.0, 10.0, 0.05) X, Y = np.meshgrid(x, y) Z = f(X, Y) # 筛选出Z接近0的点 mask = np.abs(Z) < 0.01 x_points = X[mask] y_points = Y[mask] # 绘制散点 plt.scatter(x_points, y_points, s=1, color='blue') plt.xlabel('x') plt.ylabel('y') plt.title('Approximate plot of f(x,y)=0') plt.show()
关键说明:
np.meshgrid是核心:它把一维的x、y数组转换成二维网格,让我们能遍历平面上的每一个点计算函数值。plt.contour专门用于绘制等值线,levels参数可以指定要绘制的等值线数值,这里设为[0]就精准对应f(x,y)=0的曲线。
内容的提问来源于stack exchange,提问作者Hermi
相关产品推荐
相关产品推荐

