js高斯消元法解决n元一次方程组--算等额分期

importClass(java.text.DecimalFormat);
let df = new DecimalFormat("0.##");

/***

  • 增广矩阵机型初等行变化的算法
  • @param value
  • 需要算的增广矩阵
  • @return 计算的结果
    */
    function mathDeterminantCalculation(value) {
    // 当矩阵的行数大于2时
    for (let i = 0; i < value.length; i++) {
    // 检查数组对角线位置的数值是否是0,如果是零则对该数组进行调换,查找到一行不为0的进行调换
    if (value[i][i] == 0) {
    value = changeDeterminantNoZero(value, i, i);
    }
    for (let j = 0; j < i; j++) {
    // 让开始处理的行的首位为0处理为三角形式
    // 如果要处理的列为0则和自己调换一下位置,这样就省去了计算
    if (value[i][j] == 0) {
    continue;
    }
    // 如果要是要处理的行是0则和上面的一行进行调换
    if (value[j][j] == 0) {
    let temp = value[i];
    value[i] = value[i - 1];
    value[i - 1] = temp;
    continue;
    }
    let ratio = -(value[i][j] / value[j][j]);
    value[i] = addValue(value[i], value[j], ratio);
    }
    }
    return value;
    }

    /***

  • 将i行之前的每一行乘以一个系数,使得从i行的第i列之前的数字置换为0
  • @param currentRow
  • 当前要处理的行
  • @param frontRow
  • i行之前的遍历的行
  • @param ratio
  • 要乘以的系数
  • @return 将i行i列之前数字置换为0后的新的行
    /
    function addValue(currentRow,frontRow,
    ratio){
    for (let i = 0; i < currentRow.length; i++) {
    currentRow[i] += frontRow[i]
    ratio;
    currentRow[i] =parseFloat(currentRow[i]);
    //( df.format(currentRow[i]));
    //Double.parseDouble(df.format(currentRow[i]));
    }
    return currentRow;
    }

    /**

  • 指定列的位置是否为0,查找第一个不为0的位置的行进行位置调换,如果没有则返回原来的值
  • @param determinant
  • 需要处理的行列式
  • @param line
  • 要调换的行
  • @param row
  • 要判断的列
    */
    function changeDeterminantNoZero(determinant,
    line, row){
    for (let j = line; j < determinant.length; j++) {
    // 进行行调换
    if (determinant[j][row] != 0) {
    let temp = determinant[line];
    determinant[line] = determinant[j];
    determinant[j] = temp;
    return determinant;
    }
    }
    return determinant;
    }

    /**

  • 将系数矩阵和方程值的矩阵进行合并成增广矩阵
  • @param coefficient
  • 系数矩阵
  • @param value
  • 方程值
  • @return 增广矩阵
    */
    function transferMatrix(coefficient,
    value) {
    let temp = new Array(coefficient.length);
    if (coefficient.length != value.length) {
    return temp;
    }
    // 将方程值添加到系数矩阵中
    for (let i = 0; i < coefficient.length; i++) {
    temp[i] =new Array(coefficient[0].length + 1);
    for (let j = 0; j < coefficient[0].length; j++) {
    temp[i][j] = coefficient[i][j];
    }
    }
    for (let i = 0; i < value.length; i++) {
    temp[i][temp[i].length - 1] = value[i];
    }
    return temp;
    }

    /**

  • 检查有效的行数,看非零行的个数
  • @param value
  • 需要检查的数组
  • @return 非零行的个数
    */
    function effectiveMatrix(value) {
    for (let i = value.length - 1; i > -1; i--) {
    for (let j = 0; j < value[i].length; j++) {
    if (value[i][j] != 0) {
    return i + 1;
    }
    }
    }
    return 0;
    }

    /**

  • 当方程组有解的时候计算方程组的解
  • @param mathMatrix
  • 方程组的增广矩阵
  • @return 方程组的解
    /
    function calculationResult(mathMatrix) {
    // 有解时方程组的个数等于方程组的未知数
    let result = new Array(mathMatrix.length);
    log(mathMatrix);
    for (let i = mathMatrix.length - 1; i > -1; i--) {
    let temp = 0;
    for (let j = mathMatrix[i].length; j > 0; j--) {
    // 第一个为方程的解,需要将解赋值给临时变量
    if (mathMatrix[i][j - 1] != 0) {
    if (j == mathMatrix[i].length) {
    temp = mathMatrix[i][j - 1];
    } else if ((j - 1 > -1 )&& ((result[j - 1])!=undefined)) {
    temp -= mathMatrix[i][j - 1]
    result[j - 1];
    //log((j - 1 > -1 )&&(typeof(result[j - 1])!=undefined)+";j="+j+";undefined="+(typeof(result[j - 1])!=undefined));
    } else {
    result[i] = temp / mathMatrix[i][j - 1];
    continue;
    }
    }
    }
    }
    return result;
    }

    function main() {
    /
    // 方程的未知数的个数
    int n = 3;
    // 系数矩阵
    double[][] test = { { 2, 3, 1 }, { 1,1, 1 }, { 1, 2, -1 } };
    // 方程的解
    double[] value = { 11, 6, 2 };
    方程组的解为x1=1.0 方程组的解为x2=2.0 方程组的解为x3=3.0
    */
    /*
    // 方程的未知数的个数
    int n = 4;
    // 系数矩阵
    double[][] test = { { 3, 1, -1, 1 },{ 1, -1, 1,2 }, {2,1,2,-1},{ 1,0, 2, 1 } };
    // 方程的解
    double[] value ={ -3, 4, 7,6 };
    方程组的解为x1=1.0 方程组的解为x2=-2.0 方程组的解为x3=3.0 方程组的解为x4=-1.0
    /
    /

    // 方程的未知数的个数
    int n = 4;
    // 系数矩阵
    double[][] test = { { 1, -3, 4, -5 },{ 1, -1, -1,2 }, {1,2,0,5},{ 2,-1, 3, -2 } };
    // 方程的解
    double[] value ={ 0, 0, 0,0 };
    方程组有零解
    */
    // 方程的未知数的个数
    let n = 5;
    // 系数矩阵
    let test = [[2,1, 1,1,1 ],[ 1, 2, 1,1,1 ], [1,1,3,1,1],[ 1,1,1,4,1 ],[1,1,1,1,5]];
    // 方程的解
    let value =[ 4,5,9,0,-5 ];

n=3;
value=[11,0,-2];
test=[[3,1,-2],[1,1,-1],[-1,-1,-3]]
try {
// 转换成增广矩阵并进行初等行变化
let mathMatrix = mathDeterminantCalculation(transferMatrix(
test, value));
// 找出非零行的个数
let checkMatrixRow = effectiveMatrix(mathMatrix);
// 根据未知数的个数和方程组非零行的个数来判断当前方程组的解的情况
if (n > checkMatrixRow) {
toastLog("未知数有" + n + "个,消元法后获取的阶梯方程组有"

  • checkMatrixRow + "个方程,少于未知数个数,所以该方程有无数组解");
    } else if (n < checkMatrixRow) {
    toastLog("未知数有" + n + "个,消元法后获取的阶梯方程组有"
  • checkMatrixRow + "个方程,多于未知数个数,所以该方程有无解");
    } else {
    toastLog("未知数有" + n + "个,消元法后获取的阶梯方程组有"
  • checkMatrixRow + "个方程,等于未知数个数,所以该方程有解");
    let result = calculationResult(mathMatrix);
    for (let i = 0; i < result.length; i++) {
    toastLog("方程组的解为x" + (i + 1) + "="+
    df.format(result[i]));
    }
    }
    } catch (e) {
        // TODO Auto-generated catch block
        log(e.name + ": " + e.message);
    }  

    }
    main();

原文地址:http://blog.51cto.com/13496382/2304869

时间: 2024-10-16 21:44:47

js高斯消元法解决n元一次方程组--算等额分期的相关文章

LG3389 【模板】高斯消元法 高斯消元

问题描述 LG3389 题解 高斯消元,是用来解\(n\)元一次方程组的算法,时间复杂度\(O(n^3)\) 这样就构造出了这个方程组的矩阵 目标就是把这个矩阵左边\(n \times n\)消为单位矩阵 \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; void read(int &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch<'0'||ch&

二元一次方程组求解

首先要找到二元一次方程组的通解,例如: ax+by=m cx+dy=n 不难算出 x=(md-bn)/(ad-bc) y=(mc-an)/(bc-ad) 程序代码: #include<stdio.h> #include<math.h> int main(){ int a,b,c,d,m,n; double x=0,y=0; scanf("%d,%d,%d,%d,%d,%d",&a,&b,&c,&d,&m,&n);

解不等式组、二元一次方程组、三元一次方程组

不等式性质: 一.加减同一个数,方向不变. 二.乘以(除以)同一个正数,方向不变. 三.乘以(除以)同一个负数,方向改变. 例:/3x - 15 > 0  ① \7x - 2 < 8x  ② 解①式可得 x > 5 解②可可得 -2 < x 该不等式的解集为 x > 5 解二元一次方程组: 1.消元解二元一次方程组有代入消元和加减消元法. 2.代入消元法:把二元一次方程组的一个未知数用另一个未知数表示出来,再带入另一个方程,实现消元. 3.加减消元法:两个方程中同一个未知数系

求解三元一次方程组(C++)

/** * author:johnny zen * date:2017-09-20 11:19 * function:Calculate Ternary system of equations * notice:时间仓促,仅仅实现功能,方便使用,代码质量不可参考!!! */ #include<iostream> using namespace std; template<class T> void input(T matrix[4][5]){ cout<<"p

分治题目 wikioi 1688 逆序数组 算导2-4

解题报告 算导上给了提示 用归并排序的代码进行修改来实现 思考后不难看出 归并排序的合并(merge)过程中 对数据进行了比较 1)如果数组L 的当前某元素大于数组R的当前元素,那么 由于L数组是有序的(升序) 因此 L数组当前元素以及他后面的所有元素都与R数组构成逆序对 2)我们的排序并不影响逆序对的数量 因为排序的时候不会改变当前被排序的数据和还未被处理的数据之间的位置关系(就是说 排序前在未处理元素左边的数据,排序后还在未处理元素左边,所以不改变逆序对的数量) 严格的证明待以后学好算法导论

js判断输入字符串长度(汉字算两个字符,字母数字算一个):例如 要求输入12的字,24个字节

<html> <head> <title>js判断输入字符串长度(汉字算两个字符,字母数字算一个)</title> <style type="text/css"> .pbt { margin-bottom: 10px; } .ie6 .pbt .ftid a, .ie7 .pbt .ftid a { margin-top: 1px; } .cl:after { clear: both; content: ".&quo

Node.js能解决什么问题?

一.使用Node.js能解决什么问题 对于PHP.JAVA.Python等服务端语言中,为每个客户端连接创建一个新的线程,而每个线程需要大约2M的内存,理论上,具有8GB内存的服务器可以同时连接的最大用户数为4000个左右,要让Web应用程序支持更多的用户,就需要增加服务器的数量,这样硬件的成本就增加了. 服务器所支持的最大同时连接用户量是一个主要的瓶颈. Node.js是一个用于开发各种Web服务器的开发工具,运行的是高性能的V8 JavaScript脚本语言, 二.什么是V8JavaScri

Float精度 在JS的解决方法

最近在做一个工资核算的系统,所有的运算全部在前台进行,因此用了的是JS来做. 做完以后,经手工核算,发现一个奇怪的问题.就是JS算出来的结果跟用计算器算出来的结果有差距. 想了很久,也没有想出问题出在哪里. 问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来. 我 Google了一下,发现原

三张照片解决--win10系统的edge浏览器设置为浏览器IE8,IE7,IE9---完美解决 费元星

主要思想: 第二种方法: 参考文档: 1.可以在系统盘的C:\Program Files\Internet Explorer中找到iexplore.exe,然后将其发送到桌面快捷方式即     可,其就是ie浏览器.2.如果你在刚才的目录中没有找到iexplore.exe,则有可能是因为你得服务没有打开,然后你就要在 控制面板\程     序/启动或关闭windows功能,在其中找到ie11,点击勾选上,然后重启电脑即可.在Win8.1的IE11环境里面,不少网站即使通过兼容视图也无法正常显示,