Python实现f(x,y,k)=0与g(x,y,k)=0交线在x-y平面的投影绘制
实现方案
核心思路是利用结式(Resultant) 消去公共参数k:因为你明确f、g均为k的多项式,两个多项式关于k的结式可以直接消去变量k,得到仅包含x、y的隐式方程,该方程的解集就是两个曲面交线在x-y平面的投影,之后直接用隐函数绘图工具绘制即可。
步骤1:调用sympy的结式接口消去k
sympy内置了resultant函数专门用于多项式结式计算,代码示例如下:
import sympy as sp from sympy.plotting import plot_implicit # 定义符号变量 x, y, k = sp.symbols('x y k') # 替换为你实际的f、g表达式 f = x**2 + y**2 + k**2 - 4 # 示例:球面方程 g = k**2 + x*k + y - 2 # 示例:k的二次多项式曲面 # 计算关于k的结式,消去k得到仅含x、y的投影方程 proj_equation = sp.resultant(f, g, k)
步骤2:绘制投影隐函数图像
方法1:直接用sympy内置隐函数绘制
如果投影方程复杂度不高,可以直接调用plot_implicit绘制:
# 可自行调整x、y的取值范围 plot_implicit(sp.Eq(proj_equation, 0), (x, -3, 3), (y, -3, 3), xlabel='x', ylabel='y', title='曲面交线的x-y平面投影')
方法2:转数值函数用matplotlib绘制(性能更高)
如果结式方程过于复杂导致sympy绘图卡顿,可以转成numpy数值函数后用等高线找0值线,速度更快:
import numpy as np import matplotlib.pyplot as plt # 把符号方程转成numpy可调用的数值函数 proj_func = sp.lambdify((x, y), proj_equation, 'numpy') # 生成计算网格,可调整范围和精度 xx, yy = np.meshgrid(np.linspace(-3, 3, 300), np.linspace(-3, 3, 300)) zz = proj_func(xx, yy) # 0值等高线就是投影曲线 plt.contour(xx, yy, zz, levels=[0], colors='#d62728') plt.xlabel('x') plt.ylabel('y') plt.title('曲面交线的x-y平面投影') plt.grid(alpha=0.3) plt.show()
注意事项
- 若f、g关于k的最高次项系数包含x、y,结式结果会自动包含这些系数为0的额外解,你可以根据业务逻辑自行过滤这类解。
- 当k的多项式次数很高时,结式的符号表达式会非常复杂,优先选择方法2进行数值绘制。
内容的提问来源于stack exchange,提问作者edgardeitor
相关产品推荐
相关产品推荐

