求解线性方程组&与JavaScript类似的代数问题 [英] Solving Linear Equations & similar Algebra Problems with JavaScript

查看:66
本文介绍了求解线性方程组&与JavaScript类似的代数问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是JavaScript的新手,我正在尝试编写一个解决线性方程的简单脚本。到目前为止,我的脚本只解决了加号和减号的线性方程,例如2x + 28 - 18x = 36 - 4x + 10。我希望它能够解决包含乘法和除法的线性方程/代数问题,例如2x * 3x = 4 / 2x。

I'm new to JavaScript and I am trying to write a simple script that solves linear equations. So far my script solves linear equations that are plus and minus only such as "2x + 28 - 18x = 36 - 4x + 10". I want it to also be able to solve linear equations/algebra problems that contain multiplication and division such as "2x * 3x = 4 / 2x".

我有点想知道下一步该做什么,但我认为我现在的脚本可能过于复杂,而且只会让添加乘法和除法。

I kind of have an idea of what to do next but I think the script I have right now maybe overly complex and it's only going to make it more complicated to add the multiplication and division.

下面是我的脚本。我希望能有一些关于如何改进和简化我已有的以及添加乘法和除法的最佳方法的指示?

Below is my script. I'm hoping for a few pointers on how I could improve and simplify what I already have and what the best way to add multiplication and division?

我在JS Bin上的脚本: http://jsbin.com/ufekug/1/edit

My script on JS Bin: http://jsbin.com/ufekug/1/edit

我的剧本:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Problem Solver</title>
<script>
window.onload = function() {
    // Total Xs on each side of equation
    // Example problem: 5x + 2 = 10 - 2x
    var leftSideXTotal = 0; // 5
    var rightSideXTotal = 0; // -2

    // Total integers on each side of equation
    // Example problem: 5x + 2 = 10 - 2x
    var leftSideIntTotal = 0; // 2
    var rightSideIntTotal = 0; // 10


    // Enter a math problem to solve
    var problem = "5x + 2 = 10 - 2x";


    // Remove all spaces in problem
    // Example problem: 5x + 2 = 10 - 2x
    problem = problem.replace(/\s/g,''); // 5x+2=10-2x

    // Add + signs in front of all - signs
    // Example problem: 5x + 2 = 10 - 2x
    problem = problem.replace(/-/gi, "+-"); // 5x+2=10+-2x

    // Split problem into left and right sides
    // Example problem: 5x + 2 = 10 - 2x
    var problemArray = problem.split("=");
    var problemLeftSide = problemArray[0]; // 5x+2
    var problemRightSide = problemArray[1]; // 10+-2x

    // Split values on each side into an array
    var problemLeftSideValues = problemLeftSide.split("+");
    var problemRightSideValues = problemRightSide.split("+");

    // Go through the left side values and add them up
    for (var i = 0; i < problemLeftSideValues.length; i++) {

        // Current value
        var currentValue = problemLeftSideValues[i];
        // Length of current value
        var currentValueLength = currentValue.length;

        if (currentValue.charAt(currentValueLength - 1) == "x") { //Check if current value is a X value

            // Remove X from end of current value
            currentValue = currentValue.split("x");

            // Add to total Xs on left side
            leftSideXTotal = Number(leftSideXTotal) + Number(currentValue[0]);

        } else {

            // Add to total integers on left side
            leftSideIntTotal = Number(leftSideIntTotal) + Number(problemLeftSideValues[i]);

        }
    }

    // Go through the right side values and add them up
    for (var i = 0; i < problemRightSideValues.length; i++) {

        // Current value
        var currentValue = problemRightSideValues[i];
        // Length of current value
        var currentValueLength = currentValue.length;

        if (currentValue.charAt(currentValueLength - 1) == "x") { //Check if current value is a X value

            // Remove X from end of current value
            currentValue = currentValue.split("x");

            // Add to total Xs on right side
            rightSideXTotal = Number(rightSideXTotal) + Number(currentValue[0]);

        } else {

            // Add to total integers on right side
            rightSideIntTotal = Number(rightSideIntTotal) + Number(problemRightSideValues[i]);

        }
    }

    // Compute
    var totalXs = (leftSideXTotal - rightSideXTotal)
    var totalIntegers = (rightSideIntTotal - leftSideIntTotal)
    var solution = (totalIntegers / totalXs)

    // Display solution
    document.getElementById("divSolution").innerText = solution;
}
</script>
</head>

<body>
<div id="divSolution"></div>
</body>
</html>


推荐答案

您需要编写(或使用)运营商 - 优先解析器。

You need to write (or use) an operator-precedence parser.

想法是将等式转换为树,例如

The idea is to turn the equation into a tree, e.g.

x + 3 = 3x - 2

真的是结构

        =
     /     \
    +       -
   / \     / \
  x   3   *   2
         / \
        3   x

每个操作员描述两个操作之间的操作树的分支。使用javascript对象创建结构应该不难:

Where each operator describes an operation between two "branches" of the tree. Using a javascript object it shouldn't be difficult to create the structure:

function tree(lterm,op,rterm) {
   t.operator = op;
   t.left = lterm;
   t.right = rterm;
   return t;
}

expression = tree("x", "/", tree("x","+",3) );  //    x / (x+3)

然后通过操纵树你可以解决方程,或者进行计算。要评估表达式(没有未知数),您将从终端开始,从交叉点向交叉点向上运行树。您可以用结果替换树的一部分,或者用结果注释它 - 将结果变量添加到对象。

Then by manipulating the tree you can resolve the equation, or carry out calculations. To evaluate an expression (with no unknowns), you run through the tree starting at the terminals, and upwards from intersection to intersection. You can replace a section of the tree with a result, or annotate it with a result - add a result variable to the tree object.

以下是一些包含在树类中的有用方法:

Here are some useful methods to include in a tree class:


  • getLeft

  • getRight

  • prettyPrint

  • 评估

  • evaluate(x,5)// x = 5,现在评估
    ...

  • getLeft
  • getRight
  • prettyPrint
  • evaluate
  • evaluate("x",5) // x=5, now evaluate ...

这不仅仅是可以通过这种方式解析的线性操作。更好的解析器将有一个包含= * / +的运算符列表 - 但也包括一元运算符: - ()sin cos ...

It's not just linear operations that can be "parsed" this way. Better parsers will have a list of operators that includes =*/+- but also unary operators: - ( ) sin cos...

我没有使用运算符-javascript中的-precedence解析器,但有些必须存在预写。当然,这个网站上的一个善良的灵魂将为我的回答添加一个或两个良好的链接。

I haven't used an operator-precedence parser in javascript, but some must exist prewritten. Surely a kind soul on this site will add a good link or two to my answer.

BTW,树方法有很多应用程序。在电子表格中:

BTW, the tree approach has many applications. In a spreadsheet:

A2 = A1+B1

在布尔求解器中:

A = not (B or C)
C = true

在XML解析中:

<main>
  <part>A</part>
  <part>B</part>
</main> 

这篇关于求解线性方程组&amp;与JavaScript类似的代数问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆