JavaScript 方程求解器库

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4514302/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-25 13:58:21  来源:igfitidea点击:

JavaScript equation solver library

javascriptequationsolver

提问by Will

Is there a JavaScript library or function that will solve equations for variables?

是否有可以求解变量方程的 JavaScript 库或函数?

Such as 9 = 3 + xand solve for x. But it should also solve more advanced equations that include sine, cosine, and tangent.

9 = 3 + x并求解 x。但它也应该求解更高级的方程,包括正弦、余弦和正切。

采纳答案by David Tang

You can approximatethe solution by doing what excel calls "Goal Seek" - testing values for xuntil both sides of the equation approximately match. You can do this by splitting the equation by the "="sign, replacing each occurence of xwith a value, evaling both sides, and determining if the difference falls below a certain threshold. While relatively simple, there are flaws to this method though (other than the fact that it is an approximation), for example the algorithm may think the two sides are converging when in fact it is just a local min/max and will diverge after the difference falls just below your threshold. You'll also need to test multiple start points to solve equations with more than one solution.

您可以通过执行 excel 所谓的“目标寻求”来近似解决方案 - 测试值x直到等式两边近似匹配。您可以通过用"="符号分割方程,x用一个值替换每个出现的 ,eval两边,并确定差异是否低于某个阈值来做到这一点。虽然相对简单,但这种方法存在缺陷(除了它是近似值这一事实),例如,算法可能认为两侧正在收敛,而实际上它只是局部最小值/最大值,并且会在收敛之后发散差异刚好低于您的阈值。您还需要测试多个起点以解决具有多个解决方案的方程。

For a program to actually solvean equation as a human would (by rearranging the two sides of the equation and applying inverse functions, derivatives/integrals and whatnot) is far more complex, and somehow feels entirely proprietary ;)

对于像人类一样实际求解方程的程序(通过重新排列方程的两侧并应用反函数、导数/积分等)要复杂得多,并且不知何故感觉完全是专有的;)

回答by jiggzson

I'd like to propose nerdamer. It can algebraically solve up to quartic functions and it can numerically solve a range of functions. Another library to consider is Algebrite.

我想推荐 nerdamer。它可以代数求解四次函数,并且可以数值求解一系列函数。另一个要考虑的库是Algebrite

//solve linear equations
var x = nerdamer.solve('(x+1)*3=x-6', 'x');
console.log(x.toString());
//quadratic
var x2 = nerdamer.solve('x^2-8x+15', 'x');
console.log(x2.toString());
//quadratic algebraically
var x3 = nerdamer.solve('x^2-ax+3*b', 'x');
console.log(x3.toString());
//multiple roots
var x4 = nerdamer.solve('x^6+41*x^5+652*x^4+5102*x^3+20581*x^2+40361*x+30030', 'x');
console.log(x4.toString());
//functions - numerically around to zero up to a predefined range
var x5 = nerdamer.solve('cos(x)^2+sin(x-1)', 'x');
console.log(x5.toString());
//solve a system of linear equations
var x6 = nerdamer.solveEquations(['2x+y=7', 'x-y+3z=11', 'y-z=-1']);
console.log(x6.toString());
//solve a system of nonlinear equations
var x7 = nerdamer.solveEquations(['3*x^2/y=2', 'z*x*y-1=35', '5*z^2+7=52']);
console.log(x7.toString());
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/nerdamer.core.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Algebra.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Calculus.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Solve.js"></script>

回答by orlade

A quick search turns up algebra.jsand js-solver. I don't know anything about them, but they seem legit. algebra.js has a nice OOP API, but doesn't appear to handle trigonometric functions.

快速搜索会出现algebra.jsjs-solver。我对它们一无所知,但它们似乎是合法的。algebra.js 有一个很好的 OOP API,但似乎不能处理三角函数。

回答by kaharas

Look at the script at Newton's Method Program for f(x)=0. It solves the equation using Newton's tangent method.

查看Newton's Method Program for f(x)=0中的脚本。它使用牛顿切线法求解方程。

回答by Pterodactylus

Ceres.jscan find the solution to an array of equations of the form f(x) = 0. It is ported from C++ to JavaScript with Emscripten. The file is a bit large but if you need a really high performance solver this is your best bet. It runs in web-assembly so the speed is high. Here is an example:

Ceres.js可以找到形式为 f(x) = 0 的方程数组的解。它使用 Emscripten 从 C++ 移植到 JavaScript。该文件有点大,但如果您需要一个真正高性能的求解器,这是您最好的选择。它在网络组装中运行,因此速度很高。下面是一个例子:

<p>This is an example of the solution of the Powell function using Ceres.js</p>

<textarea id="demo" rows="40" cols="170">
</textarea>

<script type="module">
    import {Ceres} from 'https://cdn.jsdelivr.net/gh/Pterodactylus/Ceres.js@master/Ceres-v1.4.13.js'

    var fn1 = function f1(x){
        return (x[0]+10*x[1]);
    }

    var fn2 = function f2(x){
        return (Math.sqrt(5)*(x[2]-x[3]));
    }

    var fn3 = function f3(x){
        return Math.pow(x[1]-2*x[2],2);
    }

    var fn4 = function f4(x){
        return Math.sqrt(10)*Math.pow(x[0]-x[3],2);
    }


    let solver = new Ceres()
    solver.add_function(fn1) //Add the first equation to the solver.
    solver.add_function(fn2) //Add the second equation to the solver.
    solver.add_function(fn3) //Add the third equation to the solver.
    solver.add_function(fn4) //Add the forth equation to the solver.
    //solver.add_callback(c1) //Add the callback to the solver.
    //solver.add_lowerbound(0,1.6) //Add a lower bound to the x[0] variable
    //solver.add_upperbound(1,1.7) //Add a upper bound to the x[1] variable

    solver.promise.then(function(result) { 
        var x_guess = [1,2,3,4] //Guess the initial values of the solution.
        var s = solver.solve(x_guess) //Solve the equation
        var x = s.x //assign the calculated solution array to the variable x
        document.getElementById("demo").value = s.report //Print solver report
        solver.remove() //required to free the memory in C++
    })
</script>