数学计算 本地计算 开箱即用 内置示例 不留痕迹

线性方程组求解器

按行输入未知数系数与常数项,用高斯消元精确求解二元或三元一次方程组:唯一解给出分数与小数两套结果,行列式与回代验证一并展示;系数成比例或互相矛盾时自动判定无穷多解与无解。

二元一次方程组是应用题最常见的模型:鸡兔同笼、和差倍分、浓度配比,最后都能化成「两个方程、两个未知数」。本工具按行填入每条方程的未知数系数与等号右边的常数,立即得到每个未知数的解——整数解直接给整数,分数解给出 1/5 这样的精确分数并同时给出小数近似,鸡兔同笼这类题填进去 1 秒出答案。

计算用 BigInt 有理数运算做高斯消元,而不是浮点近似:系数是 1/2、0.5 这类分数或小数时,解不会被舍入误差污染;工具同时给出系数行列式与回代验证——把解代回每条原方程,确认等式严格成立。方程互相矛盾时明确提示无解,成比例时提示无穷多解并给出独立约束条数,不糊弄。

使用步骤

  1. 选择方程元数:二元一次(2 个未知数)或三元一次(3 个未知数)。
  2. 每行填一条方程:从左到右填各未知数的系数,最后一格填等号右边的常数。
  3. 系数支持整数、小数与分数(如 0.5、1/2、-3)。
  4. 看求解结果:分数与小数两套解、系数行列式与回代验证;无解与无穷多解会明确说明原因。

计算原理与示例

BigInt 高斯消元全程精确

高斯消元的思路是「逐列消元」:用第一行把下面各行 x 的系数消成 0,再用第二行消去 z……最后化成阶梯形,从最后一行往回代就能解出全部未知数。本工具用 BigInt 有理数实现每一步加减乘除,全程没有浮点舍入,所以 1/5 这样的解是精确的分数而不是 0.20000001。

三种解形态的判定逻辑

唯一解、无解、无穷多解的判定看化简结果:系数行列式不为 0 时必有唯一解;化简后出现「0 = 非零常数」的矛盾行是无解(两条约束互相冲突,如 x+y=1 与 x+y=2);秩不足但没有矛盾行则是无穷多解(几个方程本质上是同一条约束)。工具直接给出判定结果与原因,不会硬算出一个假解。

回代验证与典型应用

回代验证是最后一道保险:把解代入每一条原方程,用精确分数重新计算等号两边是否严格相等。教学上这也是要求学生掌握的步骤——解完方程代回去检查一遍。鸡兔同笼(x+y=35 与 2x+4y=94)这类应用题,填入系数就能在 1 秒内得到鸡 23 只、兔 12 只的精确答案。

代码示例

JavaScript 二元用克拉默法则,三元走高斯消元

// 二元一次方程组 a1x + b1y = c1 / a2x + b2y = c2:行列式为零则无解或无穷多解
function solve2(a1, b1, c1, a2, b2, c2) {
  const det = a1 * b2 - a2 * b1;
  if (det === 0) { return null; }
  return { x: (c1 * b2 - c2 * b1) / det, y: (a1 * c2 - a2 * c1) / det };
}

// 三元及以上:高斯消元 + 回代(列主元,避免主元接近 0 时误差放大)
function solveGauss(m) {
  const n = m.length;
  for (let i = 0; i < n; i++) {
    let p = i;
    for (let r = i + 1; r < n; r++) { if (Math.abs(m[r][i]) > Math.abs(m[p][i])) { p = r; } }
    [m[i], m[p]] = [m[p], m[i]];                 // 交换主元行
    for (let r = i + 1; r < n; r++) {
      const f = m[r][i] / m[i][i];
      for (let c = i; c <= n; c++) { m[r][c] -= f * m[i][c]; }
    }
  }
  const x = new Array(n).fill(0);
  for (let i = n - 1; i >= 0; i--) {
    let s = m[i][n];
    for (let c = i + 1; c < n; c++) { s -= m[i][c] * x[c]; }
    x[i] = s / m[i][i];
  }
  return x;
}

Python 交给 numpy 解

import numpy as np

# 系数矩阵 A 与常数向量 b:A @ x = b
A = np.array([[2.0, 1.0, -1.0],
              [-3.0, -1.0, 2.0],
              [-2.0, 1.0, 2.0]])
b = np.array([8.0, -11.0, -3.0])

x = np.linalg.solve(A, b)                 # 奇异矩阵会抛 LinAlgError
print(x)                                  # [ 2.  3. -1.]

# 需要判断「无解 / 无穷多解」时先看行列式
print(np.linalg.det(A))

常见问题

方程组什么时候无解?

把方程化成阶梯形后出现「0 = 非零常数」就是无解:两条约束互相矛盾,比如 x+y=1 与 x+y=2。几何上是两条平行直线,没有交点。工具会直接说明这一点,而不是硬算出一个数。

什么时候有无穷多解?

系数行列式为 0 且方程相容时:比如 x+y=1 与 2x+2y=2,第二个方程只是第一个的两倍,本质是同一条约束。两条直线重合,直线上所有点都是解。工具会给出独立约束的条数。

系数可以填分数吗?

可以。1/2 这类分数会按有理数精确参与运算,比先化成 0.5 更准;整数、小数、分数可以混填,负号直接写在数字前。

系数行列式有什么用?

行列式不为 0 是唯一解的充分条件;在克拉默法则里,每个未知数等于「替换一列后的行列式」除以系数行列式。行列式为 0 时方程组要么无解要么无穷多解,工具据此分流判定。

回代验证是什么?

把求出的解代入每一条原方程,用精确分数重新计算等式两边是否严格相等。这是计算正确性的自检:显示「已回代验证」就说明这组解确实同时满足所有方程。

三元方程组也能解吗?

可以。切换到「三元一次」模式后每行填四个数:x、y、z 的系数与常数项,共三行。解法同样是精确高斯消元,解出 x、y、z 三个未知数的分数与小数值。

解的小数近似是怎么来的?

由精确分数直接换算而来(如 1/5 就是 0.2),不是浮点迭代的结果。需要更多位数时可以按分数自行扩展,不会累积误差。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。