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基于Ajax实现的网页Loading效果代码

    下面提供一份“JS基于Ajax实现的网页Loading效果代码”的攻略,共分为以下几个步骤。 步骤一:创建HTML文件和CSS文件 首先,我们需要创建一个基础的 HTML 文件和对应的 CSS 文件。HTML 文件中包含了页面常规结构,如头部、导航、内容等,并且在内容部分添加一个 div 元素来承载我们的 Loading 效果。CSS 文件中包含了页面元素的…

    JavaScript 2023年6月11日
    00
  • 微信小程序如何在页面跳转时进行页面导航

    微信小程序的页面开发,需要进行页面间的跳转和导航。下面是在微信小程序中进行页面导航的完整攻略。 一、使用 Navigator 组件进行页面跳转 使用 Navigator 组件 进行页面跳转是微信小程序中最基础的导航方式。其使用方式如下: <navigator url="/pages/index/index"> 跳转到首页 &l…

    JavaScript 2023年6月11日
    00
  • JavaScript 正则表达式解析

    JavaScript 正则表达式是一种用于模式匹配的功能强大工具。正则表达式由一个或多个字符组成,用于描述文本中的模式并执行匹配操作。本文将为你提供一份完整攻略,以帮助你更深入了解 JavaScript 正则表达式。 什么是正则表达式 正则表达式是一种描述文本模式的语言。它们可以用于搜索、替换和验证字符串。在 JavaScript 中,正则表达式是一种对象类…

    JavaScript 2023年5月28日
    00
  • 简单封装js的dom查询实例代码

    下面开始讲解“简单封装js的dom查询实例代码”的攻略。 1. 理解DOM及其相关API 在开始封装DOM查询代码之前,首先需要对DOM及其相关API有一定的了解。请参考以下内容: 1.1 DOM是什么? DOM是文档对象模型(Document Object Model)的缩写,是一种用于访问和操作HTML和XML文档的编程接口。DOM将文档作为由节点(包括…

    JavaScript 2023年6月10日
    00
  • Dreamweaver 网页制作的技巧

    Dreamweaver 网页制作的技巧 1. 使用样式表 使用样式表是网页制作中的一个重要技巧。可以提高网页代码的整洁性和可维护性。在 Dreamweaver 中,可以使用内部样式表或外部样式表。 内部样式表的用法 内部样式表写在 head 标签中的 style 标签内,用于指定该页面的样式。 示例代码: html <head> <styl…

    JavaScript 2023年6月11日
    00
  • 基于iframe实现类似于ajax的页面无刷新

    基于iframe实现类似于ajax的页面无刷新,可以通过以下步骤实现: 在HTML页面中定义一个iframe标签,用于加载需要动态更新的页面; 利用JavaScript动态修改iframe标签的src属性,实现页面的加载和更新; 在被加载的页面中,通过JavaScript修改主页面中的元素。 下面我们来具体看一下实现的过程: 步骤1:定义iframe标签 在…

    JavaScript 2023年6月11日
    00
  • js确定对象类型方法

    确定对象类型是JavaScript开发中非常重要的一项技能。JavaScript中有多种方法可以确定变量的类型,不同的方法在不同的场景中使用,可以大大提高代码的效率和准确性。下面我们就来详细讲解如何使用JavaScript确定对象类型的方法。 1. typeof运算符 typeof运算符是用来判断一个变量类型的方法,返回一个字符串,表示该变量的类型。它的语法…

    JavaScript 2023年5月27日
    00
  • Javascript Dom元素获取和添加详解

    关于JavaScript中Dom元素获取和添加,可以分为如下几个方面进行讲解: 一、Dom元素获取 Dom元素是页面上的元素,我们可以通过JavaScript代码获取到Dom元素以便进行操作,下面介绍一些常用的Dom元素获取方式: 1. document.getElementById 这是获取单个元素最常用的方法,通过元素id获取单个Dom元素: var e…

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