如何求多个二次多项式曲线交点?numpy.roots结果异常解惑
求解四个二次多项式交点的问题
问题描述
我有四个二次多项式函数,需要求解它们的所有交点,不确定有没有一步求解的方法。尝试两两联立函数,用numpy.roots求根,但代入根后结果不为零,想知道问题出在哪。函数如下:
y = 1.51250 * x + -0.07969 * x^2 + 18.96116 y = 1.54264 * x + -0.05879 * x^2 + 17.47277 y = 1.49669 * x + -0.04627 * x^2 + 17.69008 y = 1.72147 * x + 0.00052 * x^2 + 18.21067
联立前两个方程得到:
-0.03014x - 0.0209x^2 + 1.48839 = 0
用numpy.roots求解的代码:
coeff = [-0.03014, -0.0209, 1.48839] np.roots(coeff)
得到根:
[-7.38253508, 6.68910443]
但将这些根代入联立后的方程,结果不为零,请问问题出在哪里?
问题分析与解决
1. 系数传入顺序错误
numpy.roots要求系数按x的最高次幂到最低次幂排列(即ax² + bx + c对应的[a, b, c])。你联立前两个方程得到的正确形式是-0.0209x² -0.03014x +1.48839=0,但传入的coeff把一次项系数放在了二次项前面,顺序完全颠倒,导致求根结果错误。
正确的系数列表应为[-0.0209, -0.03014, 1.48839],用这个代入np.roots得到的根,代入方程后会非常接近0。
2. 浮点数精度误差
即使系数正确,代入根后也可能得到极小的非零值(比如1e-10量级),这是计算机浮点数运算的精度限制导致的,属于正常现象,无需纠结绝对等于0,用np.isclose()判断是否接近0即可。
3. 多函数交点的求解方式
没有一步求解所有交点的方法,必须两两联立求解:
- 四个函数共有6组两两组合(C(4,2)=6)
- 每组联立后得到一次或二次方程,用
numpy.roots求解 - 对每个求得的x值,代入原函数计算y,用浮点数接近性验证是否为交点
修正后的代码示例
import numpy as np # 按x²、x、常数项顺序定义四个函数的系数 funcs = [ [-0.07969, 1.51250, 18.96116], [-0.05879, 1.54264, 17.47277], [-0.04627, 1.49669, 17.69008], [0.00052, 1.72147, 18.21067] ] # 遍历所有两两组合求解交点 for i in range(len(funcs)): for j in range(i+1, len(funcs)): a1, b1, c1 = funcs[i] a2, b2, c2 = funcs[j] # 计算联立方程的系数:(a1-a2)x² + (b1-b2)x + (c1-c2) = 0 coeff = [a1 - a2, b1 - b2, c1 - c2] roots = np.roots(coeff) print(f"函数{i+1}与函数{j+1}的交点:") for x in roots: y1 = a1*x**2 + b1*x + c1 y2 = a2*x**2 + b2*x + c2 if np.isclose(y1, y2): print(f"x={x:.6f}, y={y1:.6f}") else: print(f"x={x:.6f} 验证不通过(可能为计算误差)")
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

