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

函数图像绘制求助:已知值域无法绘图及代码优化建议

解决二次曲线绘图问题:修正表达式与高效绘图方案

看起来你在绘制二元二次曲线时遇到了两个核心问题:推导的y表达式有误,以及x范围设置不当导致计算出现无效值。让我一步步帮你解决这些问题,同时分享更高效的绘图方法。

一、先修正你的推导与代码

首先,原方程 5x² - 4xy + 2y² = 30 需要整理为关于y的一元二次方程再求解:

整理后:2y² - 4x y + (5x² - 30) = 0

用一元二次方程求根公式 y = [-b ± √(b²-4ac)]/(2a),这里a=2,b=-4x,c=5x²-30,计算判别式:

判别式 D = (-4x)² - 4*2*(5x²-30) = 16x² - 8*(5x²-30) = -24x² + 240

只有当D ≥ 0时,y才有实数解,即-24x² +240 ≥0 → x² ≤10 → x ∈ [-√10, √10],这才是正确的x取值范围。

你的推导中错误地简化了根号部分,正确的y表达式应该是:

y = [4x ± √(-24x² +240)] / (2*2) = x ± √(240-24x²)/4

现在修正你的代码:

import numpy as np
import matplotlib.pyplot as plt

# 设置正确的x范围:[-√10, √10]
x = np.linspace(-np.sqrt(10), np.sqrt(10), 1000)  # 1000个点足够平滑,无需1e6
D = 240 - 24 * x**2
# 计算两个分支的y值
y_upper = x + np.sqrt(D)/4
y_lower = x - np.sqrt(D)/4

plt.plot(x, y_upper, 'r', label='Upper branch')
plt.plot(x, y_lower, 'b', label='Lower branch')
plt.ylim(-10,10)
plt.xlim(-np.sqrt(10), np.sqrt(10))  # 匹配x的有效范围
plt.grid()
plt.xlabel('x')
plt.ylabel('y')  # 你之前写成了'i',这里修正
plt.legend()
plt.show()

这段代码应该能正常运行并画出曲线,因为我们限制了x在有效范围内,避免了根号内出现负数导致的NaN值。

二、更高效的绘图方法:直接绘制隐函数

对于这类二元隐函数方程,不需要手动解出y关于x的表达式,用matplotlib的contour函数可以直接绘制等高线(即z=0的曲线),步骤更简单:

import numpy as np
import matplotlib.pyplot as plt

# 生成网格点
x = np.linspace(-6, 6, 1000)
y = np.linspace(-6, 6, 1000)
X, Y = np.meshgrid(x, y)

# 计算隐函数表达式
Z = 5*X**2 - 4*X*Y + 2*Y**2 - 30

# 绘制Z=0的等高线,即原方程的曲线
plt.contour(X, Y, Z, levels=[0], colors='purple', linewidths=2)
plt.grid()
plt.xlabel('x')
plt.ylabel('y')
plt.title('5x² - 4xy + 2y² = 30')
plt.show()

这种方法的优势在于:

  • 无需手动推导表达式,避免代数错误
  • 可以直观看到整个区域内的曲线,不会因为分支问题遗漏部分图形
  • 代码更简洁,运行效率也不错

三、补充:用参数方程绘制椭圆

因为原方程是一个椭圆(二元二次方程判别式B²-4AC=(-4)^2-4*5*2=-24<0),我们可以用参数方程来绘制,精度更高且计算稳定:

import numpy as np
import matplotlib.pyplot as plt

# 椭圆参数计算
theta = 0.5 * np.arctan(-4/(5-2))  # 旋转角度
a = np.sqrt(15)  # 长半轴
b = np.sqrt(10)  # 短半轴

# 生成参数θ
t = np.linspace(0, 2*np.pi, 1000)
# 标准椭圆坐标
x_std = a * np.cos(t)
y_std = b * np.sin(t)
# 旋转回原坐标系
x = x_std * np.cos(theta) - y_std * np.sin(theta)
y = x_std * np.sin(theta) + y_std * np.cos(theta)

plt.plot(x, y, 'green', linewidth=2)
plt.grid()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Ellipse: 5x² - 4xy + 2y² = 30')
plt.axis('equal')  # 保证椭圆形状不失真
plt.show()

这种方法适合需要精确控制椭圆形状和方向的场景,而且axis('equal')可以让椭圆显示为真实的形状,不会被坐标轴比例拉伸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:13:50