Есть ли библиотека или функция JavaScript, которая будет решать уравнения для переменных?
Например, 9 = 3 + x
и решить для x. Но он также должен решать более сложные уравнения, включающие синус, косинус и тангенс.
Есть ли библиотека или функция JavaScript, которая будет решать уравнения для переменных?
Например, 9 = 3 + x
и решить для x. Но он также должен решать более сложные уравнения, включающие синус, косинус и тангенс.
Вы можете аппроксимировать решение, выполнив то, что в Excel называется "Поиск цели" - проверяя значения для x
до тех пор, пока обе части уравнения приблизительно не совпадут. Вы можете сделать это, разделив уравнение по знаку "="
, заменив каждое вхождение x
значением, eval
сопоставив обе стороны и определив, падает ли разница ниже определенного порога. Хотя этот метод относительно прост, у него есть недостатки (кроме того факта, что это приближение), например, алгоритм может думать, что две стороны сходятся, когда на самом деле это просто локальный минимум/максимум, и они расходятся после того, как разница падает чуть ниже вашего порога. Вам также потребуется протестировать несколько начальных точек, чтобы решить уравнения с более чем одним решением.
Для программы, которая на самом деле решает уравнение так, как это сделал бы человек (путем перестановки двух частей уравнения и применения обратных функций, производных/интегралов и многого другого), это гораздо сложнее и каким-то образом кажется полностью проприетарным; )
Я хотел бы предложить 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>
Быстрый поиск выдает алгебра.js и js-решатель. Я ничего не знаю о них, но они кажутся законными. алгебра.js имеет хороший API-интерфейс ООП, но, похоже, не обрабатывает тригонометрические функции.
Посмотрите на сценарий в Программа метода Ньютона для f(x)= 0. Уравнение решается с помощью метода касательных Ньютона.
Ceres.js может найти решение массива уравнений вида f(x) = 0. Он перенесен с C++ на JavaScript с помощью Emscripten. Файл немного большой, но если вам нужен действительно высокопроизводительный решатель, это ваш лучший выбор. Он работает в веб-сборке, поэтому скорость высокая. Вот пример:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<h2>Powell Function</h2>
<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.5.3.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>
</body>
</html>
0.1 + 0.2
не равно0.3
. Это затрудняет решение уравнений, содержащих десятичные значения. - person Šime Vidas   schedule 23.12.2010