JS求解三元一次方程组值的方法

JS求解三元一次方程组值的方法

解三元一次方程组即为求解下列形式的方程:

a1*x + b1*y + c1*z = d1
a2*x + b2*y + c2*z = d2
a3*x + b3*y + c3*z = d3

其中,x、y、z分别为未知数,其他为已知数(系数和常数)。解方程的过程就是求出未知数x、y、z的值。

利用矩阵求解

其中,最通用的 method 是利用矩阵逆推法,将方程组写成矩阵的形式,然后进行高斯-约旦(高斯消元法)消元,进而解出待定量。

function calcEquation(mat, val) {
  const eps = 1e-10, n = mat.length;
  const a = Array(n).fill(0).map(() => Array(n + 1).fill(0));
  for (let i = 0; i < n; ++i) {
    for (let j = 0; j < n; ++j) {
      a[i][j] = mat[i][j];
    }
    a[i][n] = val[i];
  }
  for (let i = 0; i < n; ++i) {
    let pivot = i;
    for (let j = i + 1; j < n; ++j) {
      if (Math.abs(a[j][i]) > Math.abs(a[pivot][i])) {
        pivot = j;
      }
    }
    [a[i], a[pivot]] = [a[pivot], a[i]];
    if (Math.abs(a[i][i]) < eps) {
      return null;
    }
    for (let j = i + 1; j < n; ++j) {
      const f = a[j][i] / a[i][i];
      for (let k = i + 1; k <= n; ++k) {
        a[j][k] -= f * a[i][k];
      }
    }
  }
  const x = Array(n).fill(0);
  for (let i = n - 1; i >= 0; --i) {
    for (let j = i + 1; j < n; ++j) {
      a[i][n] -= a[i][j] * x[j];
    }
    if (Math.abs(a[i][i]) < eps) {
      return null;
    }
    x[i] = a[i][n] / a[i][i];
  }
  return x;
}

案例示例

例如,我们要求解下列三元一次方程组:

3*x + 6*y - 2*z = 1
7*x - 5*y + 3*z = 2
4*y + 1*z = 5

首先将方程组转化为矩阵的形式:

3, 6, -2, 1
7, -5, 3, 2
0, 4, 1, 5

然后使用前面的函数进行计算:

calcEquation([[3, 6, -2], [7, -5, 3], [0, 4, 1]],
             [1, 2, 5]);

得到结果:

[0.5, 1, 2]

即x=0.5,y=1,z=2。另外,如果方程组无解,则会返回null。

更多矩阵逆推算法可以自行了解。

利用高斯约旦法求解

高斯约旦法是一种常用的解线性方程组的方法,它的基本思想是把线性方程组写成增广矩阵的形式,然后进行多次行变换,直到把增广矩阵化为行阶梯形矩阵,再进行回带求解过程,最终得到方程组的解。

function gauss(mat, val) {
  const n = mat.length;
  for (let i = 0; i < n; ++i) {
    let pivot = -1;
    for (let k = i; k < n; ++k) {
      if (Math.abs(mat[k][i]) > 0) {
        pivot = k;
        break;
      }
    }
    if (pivot === -1) {
      return null;
    }
    if (pivot !== i) {
      [mat[i], mat[pivot]] = [mat[pivot], mat[i]];
      [val[i], val[pivot]] = [val[pivot], val[i]];
    }
    const coeff = mat[i][i];
    for (let k = i + 1; k <= n; ++k) {
      mat[i][k] /= coeff;
    }
    val[i] /= coeff;
    for (let j = 0; j < n; ++j) {
      if (i === j) {
        continue;
      }
      const coefj = mat[j][i];
      for (let k = i + 1; k <= n; ++k) {
        mat[j][k] -= coefj * mat[i][k];
      }
      val[j] -= coefj * val[i];
    }
  }
  return val;
}

案例示例

例如,我们仍然要求解下列三元一次方程组:

3*x + 6*y - 2*z = 1
7*x - 5*y + 3*z = 2
4*y + 1*z = 5

将该方程组表示为增广矩阵的形式:

3, 6, -2, 1
7, -5, 3, 2
0, 4, 1, 5

然后使用高斯约旦法函数进行计算:

gauss([[3, 6, -2, 1], [7, -5, 3, 2], [0, 4, 1, 5]]);

得到结果:

[0.5, 1, 2]

即x=0.5,y=1,z=2。另外,如果方程组无解,则会返回null。

高斯约旦法的优点是简单易懂,实现起来比较容易。它的缺点是矩阵元素需要进行浮点运算,并且如果矩阵行列式为0,就不能使用该方法求解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS求解三元一次方程组值的方法 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 疯掉了,尽然有js写的操作系统

    关于“疯掉了,竟然有JS写的操作系统”,我可以提供以下攻略。 什么是“JS操作系统” “JS操作系统”实际上是基于浏览器的操作系统,使用前端技术进行开发,其核心思想是JavaScript虚拟机和Web浏览器的结合。在这种操作系统中,所有IED编写的HTML、CSS和JavaScript均可作为应用程序运行。 如何搭建“JS操作系统” 1. 安装Node.js…

    JavaScript 2023年5月27日
    00
  • 关于JavaScript中JSON的5个小技巧分享

    下面是关于JavaScript中JSON的5个小技巧分享的完整攻略: 1. 使用JSON.parse()解析JSON字符串 在JavaScript中,我们可以使用JSON.parse()方法将JSON字符串解析为JavaScript对象。例如: const jsonStr = ‘{"name": "Tom", &quo…

    JavaScript 2023年5月27日
    00
  • Node8中AsyncHooks异步生命周期

    Node8中AsyncHooks异步生命周期攻略 什么是AsyncHooks AsyncHooks是Node.js自带的一个模块,它提供了一套API,用于在Node.js应用程序的生命周期内跟踪异步调用的生命周期。 AsyncHooks可以让Node.js开发人员更好地理解异步代码的执行流,并且可以进行更深入的性能分析和调试。 AsyncHooks的使用方法…

    JavaScript 2023年5月28日
    00
  • JS解析url参数为json对象问题

    将URL参数解析为JSON对象是JavaScript中的一项常见任务。在处理URL参数时,可以使用一些内置函数和库来使此任务变得简单。以下是一个完整的攻略,它将指导你如何使用不同的方法来解析URL参数为JSON对象: 方法一:使用URLSearchParams(推荐) URLSearchParams是在ES2015中引入的新的JavaScript API,在…

    JavaScript 2023年5月27日
    00
  • js浮点数精确计算(加、减、乘、除)

    下面是js浮点数精确计算的完整攻略: 问题描述 在JavaScript中对浮点数进行计算时,由于采用 IEEE 754 标准,浮点数会存在精度误差。例如: 0.1 + 0.2 // 返回0.30000000000000004 而不是我们期望的 0.3。这种精度误差可能会在一些需要精确计算的场景下带来问题。本文将介绍如何使用JavaScript实现浮点数的精确…

    JavaScript 2023年6月10日
    00
  • jQuery实现动画效果的简单实例

    下面我将详细讲解“jQuery实现动画效果的简单实例”的完整攻略。 前言 在现代web开发中,我们经常需要制作各种动画效果来增加用户体验,利用jQuery来实现动画效果可以帮助开发人员大大降低实现的难度和代码量。在这篇攻略中,我们将通过两个简单的例子来演示如何使用jQuery来实现动画效果。 实例1:淡入淡出效果 下面是一个简单的jQuery实现淡入淡出效果…

    JavaScript 2023年6月10日
    00
  • 详细讲解JavaScript中的this绑定

    详细讲解JavaScript中的this绑定 在JavaScript中,this用于指向当前对象,也就是函数执行时的上下文对象。this的指向在不同的情境下会被绑定到不同的对象上,因此在使用this时,必须了解其绑定机制。 1. 普通函数中的this 在普通函数中,this的指向由调用方式决定。如果是作为属性方法调用,this指向该属性所在的对象;如果作为普…

    JavaScript 2023年6月10日
    00
  • javascript的基础交互详解

    JavaScript的基础交互详解 JavaScript是一种用于在网页中实现交互效果的编程语言。它的主要应用领域之一是Web开发,可以实现动态效果和交互逻辑。 给HTML元素绑定事件 当用户对网页进行操作时(例如点击按钮、移动鼠标等),我们可以通过绑定事件来触发JavaScript代码的执行。在HTML中,我们可以通过on开头的属性来绑定事件。 例如,我们…

    JavaScript 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部