已知顶点与两点,用Matplotlib绘制抛物线及生成抛物数值向量
生成指定顶点与点的抛物数值向量方案
1. 先明确核心矛盾
你给出的三个点:顶点[5,2]、[1,1]、[10,1],无法共处于同一条抛物线。验证过程:
抛物线顶点式为 y = a(x - h)² + k,其中(h,k)是顶点坐标(5,2),代入后方程为 y = a(x-5)² + 2。
- 代入点[1,1]:
1 = a(1-5)² + 2→ 16a = -1 →a = -1/16 - 代入点[10,1]:计算得
y = (-1/16)(10-5)² + 2 = 7/16 ≈ 0.4375,和给定的y值1不符。
以下分两种场景给出解决方案:
2. 场景一:调整点以满足严格共线抛物线
如果要让顶点和其中一个点严格在抛物线上,保留顶点[5,2]与点[1,1],生成对应数值向量的Python实现如下:
import numpy as np # 生成0到10的x数值向量(100个均匀采样点) x_vec = np.linspace(0, 10, 100) # 顶点参数 h, k = 5, 2 # 由点[1,1]计算得到的系数a a = -1/16 # 计算对应的y数值向量 y_vec = a * (x_vec - h)**2 + k # 查看前5组值 print("x前5个值:", x_vec[:5]) print("y前5个值:", y_vec[:5])
3. 场景二:拟合接近三个点的抛物线(最小二乘法)
如果必须保留给定的三个点,用最小二乘法拟合最接近的抛物线,生成数值向量的代码如下:
import numpy as np # 给定的三个点 points = np.array([[5,2], [1,1], [10,1]]) x_points = points[:, 0] y_points = points[:, 1] # 构建拟合矩阵,求解抛物线一般式y = ax² + bx + c的系数 A = np.vstack([x_points**2, x_points, np.ones(len(x_points))]).T a, b, c = np.linalg.lstsq(A, y_points, rcond=None)[0] # 生成0到10的x向量并计算拟合后的y向量 x_vec = np.linspace(0, 10, 100) y_fit_vec = a * x_vec**2 + b * x_vec + c print(f"拟合方程: y = {a:.4f}x² + {b:.4f}x + {c:.4f}") print("x=10对应的拟合y值:", y_fit_vec[x_vec == 10])
4. 可视化验证(可选)
如果需要查看效果,用matplotlib绘制图像:
import matplotlib.pyplot as plt # 场景一绘图 plt.figure(figsize=(8,4)) plt.plot(x_vec, y_vec, label='顶点+[1,1]的抛物线') plt.scatter([5,1], [2,1], color='red', label='给定顶点与点') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.show() # 场景二绘图 plt.figure(figsize=(8,4)) plt.plot(x_vec, y_fit_vec, label='拟合三个点的抛物线') plt.scatter(x_points, y_points, color='red', label='给定三个点') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Logan McNulty
相关产品推荐
相关产品推荐

