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

如何求多个二次多项式曲线交点?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:25:44