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

yizhihongxing

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获取触发事件元素在整个网页中的绝对坐标(示例代码)

    正常情况下,通过JavaScript获取元素坐标有两种方式:相对于视口的位置(即viewport)和相对于文档的位置。获取相对于整个文档的坐标,也被称为获取元素的绝对坐标。 方法一:使用element.getBoundingClientRect() element.getBoundingClientRect()可以返回元素的大小及其相对于视口的位置。该方法返…

    JavaScript 2023年6月10日
    00
  • JavaScript整除运算函数ceil和floor的区别分析

    下面我来为你讲解一下“JavaScript整除运算函数ceil和floor的区别分析”。 1. 序言 在 JavaScript 中,Math.ceil() 和 Math.floor() 都是用于实现上取整和下取整操作的函数。在实际开发过程中,这两个函数经常被用来计算数据的精度。但是这两个函数之间还是有一些微小的差异,接下来我们将会逐一解释它们之间的区别。 2…

    JavaScript 2023年6月11日
    00
  • JavaScript定时器实现的原理分析

    关于“JavaScript定时器实现的原理分析”的完整攻略,以下内容供参考。 纯文本格式 一、JavaScript定时器的种类 在JavaScript中,有两种类型的定时器:setTimeout和setInterval。它们两者的区别在于: setTimeout:只执行一次定时任务,执行完后就不再执行; setInterval:每隔一段时间重复执行定时任务。…

    JavaScript 2023年5月28日
    00
  • Javascript Date getUTCDay() 方法

    JavaScript 中的 getUTCDay() 方法用于获取 Date 对象中的星期几,以 UTC 时间为准。在本教程中,我们将详细介绍 getUTCDay() 方法的使用方法。 getUTCDay() 方法的基本语法如下: date.getUTCDay() 其中,date 是要获取星期几的 Date 对象。 以下两个示例说明: 示例一:使用 getUT…

    JavaScript 2023年5月11日
    00
  • Javascript立即执行函数(IIFE)实例详解

    Javascript立即执行函数(IIFE)实例详解 在Javascript中,立即执行函数指的是定义完函数后立即自动调用该函数,避免了函数命名污染全局变量的问题,同时可以更好地保护函数内部的变量隐私和封装性。下面就是关于Javascript立即执行函数的详细攻略。 什么是Javascript立即执行函数 Javascript立即执行函数的定义格式如下: (…

    JavaScript 2023年5月27日
    00
  • 微信小程序可滑动月日历组件使用详解

    下面是关于“微信小程序可滑动月日历组件使用详解”的完整攻略: 一、安装 安装这个可滑动月日历组件很简单,只需要使用npm进行安装即可: npm i calendar-month 二、引用组件 在需要使用月日历组件的页面中,引用月日历组件的wxml文件路径,并在js文件中绑定对应的组件属性即可: <!– 日历组件 –> <calendar…

    JavaScript 2023年6月10日
    00
  • js获取当前时间(昨天、今天、明天)

    获取当前时间可以使用JavaScript内置对象Date来实现,可以获取当前时间的年份、月份、日期、小时、分钟、秒数、毫秒数等信息。下面是js获取当前时间(昨天、今天、明天)的完整攻略: 获取当前时间 使用new Date()方法创建Date对象,将当前时间赋值给它。 let now = new Date(); 获取昨天的时间 要获取昨天的时间,需要将当前时…

    JavaScript 2023年5月27日
    00
  • javascript编程必备_JS语法字典

    JavaScript编程必备_JS语法字典 介绍 本篇文章是一份JavaScript语法字典,旨在为初学者提供参考,帮助他们了解和掌握JavaScript的基础语法。 数字类型 JavaScript中的数字类型是通过Number构造函数表示的。以下是一些常见的数字类型操作和方法: 创建数字类型 在JavaScript中创建数字类型可以使用数字字面量或Numb…

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