640. 求解方程(JavaScript)

题目描述

在这里插入图片描述

思路

顺序遍历字符串,遍历过程直接算出x的系数(coefficient),以及另外一个常数(value)
借用=切割两个字符串,整体分成左右两部分处理,因为符号不一样。
字符串处理的时候有以下情况:

  • 只有x:更新系数coefficient
  • “+”或者“-”:更新符号标识符curSign
  • 数字
    • 全是数字:更新value,遇到+或-时进行下一步处理
    • 数字后面有x:更新系数coefficient,接着进行下一步处理

补充

  • 全局变量置零,要不然后台多个连续用例过不了
  • Number( ),将参数转化成数字
  • isNaN( ), 不是数字则返回 true,是数字类型则返回 false

AC代码

在这里插入图片描述

全注释

/**
 * @param {string} equation
 * @return {string}
 */
let coefficient=0;//x的系数
let value =0;

var solveEquation = function(equation) {
    //全局变量置零,要不然后台多个连续用例过不了
    coefficient=0;
    value = 0;
    //等号左边一组,等号右边一组
    let array = equation.split("=");
    parse(array[0],1);
    parse(array[1],-1);
    if(coefficient==0)
        return value==0?"Infinite solutions":"No solution";
    else
        return "x="+(-value/coefficient);
};

var parse= function (str,sign){
    i=0;
    curSign=1;
    while(i<str.length){
        //处理单个x
        if(str[i]=='x'){
            coefficient+=sign*curSign;
            i++;
        }
        //处理+号,改变下一次运算的正负标识符curSign
        else if(str[i]=='+'){
            curSign=1; 
            i++;
        }
        //处理-号,改变下一次运算的正负标识符curSign
        else if(str[i]=='-'){
            curSign=-1; 
            i++;
        } 
        //处理数字
        else{
            let num=0;
            //循环遍历所有数字并且存储
            while(i<str.length&&!isNaN(Number(str[i]))){
                num=num*10+Number(str[i])
                i++;
            }
            //当数字后面是x时
            if(str[i]=='x'){
                coefficient+=num*curSign*sign;
                i++;
            }
            //当数字后面时+或者-时
            else
                value+=num*curSign*sign;
        }
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matter Lab 是一个开源的 JavaScript 库,用于科学计算和数据可视化。它包含了许多数学和科学计算中常用的算法和工具,其中也包括了解线性方程组的高斯-赛德尔迭代法。 在 Matter Lab 中,可以使用以下代码来解形如Ax=b的线性方程组: ```javascript const { Matrix, LUDecomposition } = require('mathjs') // 解Ax=b,其中A为系数矩阵,b为常数向量 function gaussSeidel(A, b, maxIter = 1000, tol = 1e-6) { const n = A.size()[0] let x = Matrix.zeros(n, 1) let D = Matrix.diag(A.diag()) let L = Matrix.zeros(n, n) let U = Matrix.zeros(n, n) // 分解A为D-L-U for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { if (i < j) { U.set([i, j], A.get([i, j])) } else if (i > j) { L.set([i, j], A.get([i, j])) } } } // 迭代解 for (let iter = 0; iter < maxIter; iter++) { let x0 = x.clone() for (let i = 0; i < n; i++) { let sum1 = 0 let sum2 = 0 for (let j = 0; j < i; j++) { sum1 += L.get([i, j]) * x.get([j, 0]) } for (let j = i + 1; j < n; j++) { sum2 += U.get([i, j]) * x0.get([j, 0]) } x.set([i, 0], (b.get([i, 0]) - sum1 - sum2) / D.get([i, i])) } if (x0.sub(x).norm() < tol) { break } } return x } // 示例 const A = Matrix([ [4, -1, 0], [-1, 4, -1], [0, -1, 4] ]) const b = Matrix([[1], [0], [1]]) const x = gaussSeidel(A, b) console.log(x.toString()) ``` 在上面的代码中,我们使用了 mathjs 库中的 Matrix 类来表示矩阵,并使用 LUDecomposition 类来进行矩阵分解。具体来说,我们首先将系数矩阵A分解为D-L-U的形式,然后根据高斯-赛德尔迭代公式进行迭代解。当两次迭代的解之差小于给定的容差tol时,迭代停止并返回解x。 需要注意的是,高斯-赛德尔迭代法并不一定收敛,因此在实际使用中需要进行收敛性的分析,并可能需要使用其他的解方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值