Matplotlib绘图结果与WolframAlpha不符的修正咨询
问题分析与修正方案
你的代码存在两个核心问题:
- 方程处理逻辑错误:原方程
y = 10ty + y²t + 20是关于y的二次方程,不能直接通过赋值表达式计算y值,需要先整理为标准二次方程形式,再用求根公式求解y关于t(对应代码里的x)的表达式。 - 变量未定义:代码中计算y时直接使用了未初始化的变量
y,这会导致运行错误或异常结果。
修正步骤
- 整理方程:将原方程移项整理为标准二次方程形式:
( t y^2 + (10t - 1)y + 20 = 0 )
- 求根公式求解y:对于一元二次方程 ( ay^2 + by + c = 0 ),解为 ( y = \frac{-b \pm \sqrt{b^2-4ac}}{2a} ),代入对应系数可得:
( y = \frac{-(10t-1) \pm \sqrt{(10t-1)^2 - 80t}}{2t} )
- 筛选有效t范围:根号内的判别式需非负才有实数解,计算得判别式 ( D=100t^2-100t+1 ),当 ( t \leq 0.0101 ) 或 ( t \geq 0.9899 ) 时,D≥0,存在实数y。
修正后的代码
import numpy as np import matplotlib.pyplot as plt # 定义t的范围(对应原代码的x) t = np.linspace(-2, 2, 400) # 计算判别式 discriminant = (10*t - 1)**2 - 80*t # 筛选出判别式非负的t值(避免复数解) valid_t = t[discriminant >= 0] valid_disc = discriminant[discriminant >= 0] # 计算两个y的解 y1 = [(-(10*t_val -1) + np.sqrt(d_val))/(2*t_val) for t_val, d_val in zip(valid_t, valid_disc)] y2 = [(-(10*t_val -1) - np.sqrt(d_val))/(2*t_val) for t_val, d_val in zip(valid_t, valid_disc)] # 创建绘图 fig = plt.figure(figsize=(10, 5)) plt.plot(valid_t, y1, label='y₁') plt.plot(valid_t, y2, label='y₂') plt.xlabel('t') plt.ylabel('y') plt.legend() plt.grid(True) plt.show()
说明
- 代码中通过列表推导式计算y值,避免t=0时的除零错误(t=0时原方程变为
-y +20=0,即y=20,若需要可单独添加这个点)。 - 绘图结果会包含两条曲线,对应二次方程的两个解,与目标结果一致。
内容的提问来源于stack exchange,提问作者Kunto97
相关产品推荐
相关产品推荐

