You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python/SageMath中绘制带等高线的3D图及二次型水平集

嘿,我来帮你搞定这两个绘图需求,尤其是你卡在SageMath二次型绘图的部分~

一、Python中绘制带等高线的3D图形

在Python里,我们可以用matplotlib的mplot3d模块绘制3D曲面,再叠加2D等高线投影到xy平面,示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 定义要绘制的函数
def f(x, y):
    return (1/4)*x**2 + (1/9)*y**2

# 生成网格数据
x = np.linspace(-4, 4, 100)
y = np.linspace(-4, 4, 100)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)

# 创建绘图对象和3D轴
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D曲面
surf = ax.plot_surface(X, Y, Z, cmap='gist_rainbow', alpha=0.7)

# 绘制xy平面上的等高线投影
contour = ax.contour(X, Y, Z, zdir='z', offset=0, cmap='gist_rainbow', linewidths=1.5)

# 添加颜色条、标签和标题
fig.colorbar(surf, shrink=0.5, aspect=5)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D Surface with Contours')

plt.show()

这段代码会生成一个半透明的3D曲面,同时在xy平面(z=0位置)显示对应的等高线,颜色条可以帮你对应数值和颜色。

二、SageMath中绘制二次型及其水平集(解决你的代码问题)

你之前的代码出现分离文件的问题,大概率是因为没有正确合并图形、未明确函数定义,或者没有使用合适的查看器。下面是修正后的完整代码,能在同一个窗口里显示3D二次型曲面和对应的水平集(等高线):

# 1. 明确定义二次型函数
f(x, y) = (1/4)*x^2 + (1/9)*y^2

# 2. 创建空的图形容器,用于合并3D曲面和等高线
combined_plot = Graphics()

# 3. 添加3D二次型曲面,设置半透明以便看清等高线
combined_plot += plot3d(f, (x, -4, 4), (y, -4, 4), 
                        opacity=0.6, color='lightcyan', label='Quadratic Form')

# 4. 添加指定h值的水平集(等高线)
for h in [0.5, 1, 2, 3, 4, 5]:
    combined_plot += contour_plot(f, (x, -4, 4), (y, -4, 4), 
                                  fill=False, labels=True, 
                                  contours=[h],  # 只绘制当前h对应的等高线
                                  color='darkorange', linewidth=1.2,
                                  label=f'Level set h={h}')

# 5. 设置图形属性并显示,用jviewer确保3D和等高线在同一窗口
combined_plot.set_title(r"Quadratic Form $f(x,y)=\frac{1}{4}x^2+\frac{1}{9}y^2$ & Its Level Sets")
combined_plot.show(viewer='jmol', figsize=(8, 6))

你之前代码的问题分析:

  • 没有明确定义函数f,导致contour_plot调用的f可能未关联到你的二次型
  • contours=10会自动生成10条等高线,但你需要的是指定h值的水平集,应该把参数设为[h]
  • 未指定合适的viewer,SageMath默认可能会把3D图和2D等高线分开输出,viewer='jmol'可以让两者在同一个3D视图里叠加显示
  • 给3D曲面设置opacity(透明度),能让下方的等高线更清晰

如果想把水平集画成3D平面(而不是xy平面的投影),可以用implicit_plot3d替换contour_plot,示例:

for h in [0.5, 1, 2]:
    combined_plot += implicit_plot3d(f(x,y) == h, (x,-4,4), (y,-4,4), (z,0,h), 
                                     color='red', opacity=0.3)

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:40:03