Можно ли преобразовать строку, представляющую собой уравнение с переменной, в уравнение?

Мне нужно преобразовать строку, возвращенную из prompt, в уравнение, однако parseFloat возвращает только первое число и символы в уравнении и останавливается на переменной. Переменная всегда будет = x. Программа предназначена для преобразования алгебраического выражения, например 15*x(5^4-56)*17/x=15, в выражение и вычисления значения x. Если бы кто-то мог показать мне, как это сделать, это значительно помогло бы. В настоящее время я использую несколько подсказок: пользователь вводит уравнение до x, затем уравнение после x, затем оно вставляет переменную между ними и вычисляет ее значение.

Редактировать:

У меня нет предопределенных переменных, и он должен работать в уравнениях, где x > 1000 или x != //an integer.

Заранее спасибо!


person Travis    schedule 11.12.2014    source источник
comment
Рассматривали ли вы возможность использования регулярного выражения для разбора строки на пригодные для использования токены?   -  person PartyLich    schedule 11.12.2014
comment
@PartyLich Нет, на самом деле я этого не делал. Как бы я это сделал?   -  person Travis    schedule 12.12.2014
comment
Используйте Mathematica или что-то в этом роде. См. davidwees.com/coding/2006/11/, stackoverflow.com/questions/14191678/, stackoverflow.com/questions/4514302/.   -  person    schedule 12.12.2014
comment
Приведенный вами пример имеет x как в числителе, так и в знаменателе, что означает, что решения нет. Это только один случай, показывающий, насколько это трудная теоретическая проблема. Вы не должны пытаться написать это самостоятельно. Люди тратят всю свою карьеру на написание таких решателей, особенно если вы хотите обрабатывать очень общие случаи, включая полиномы, тригонометрические функции, многомерные выражения и т. д.   -  person    schedule 12.12.2014
comment
@torazaburo Программа предназначена просто для того, чтобы помочь людям в моем математическом классе с алгеброй. Многие из них борются, и они просто задают вопрос, и они получают ответ и объяснение. Я не пытаюсь делать такие вещи, как тригонометрия или многомерные выражения.   -  person Travis    schedule 12.12.2014
comment
Я бы порекомендовал библиотеку для разбора выражения. Вы можете найти их относительно легко в Интернете. Затем вам нужно написать JS, который реструктурирует выражение, чтобы изолировать вычисляемую переменную с одной стороны, что может быть проще в случаях типа x + 1 = 2 и сложнее в случаях типа x / (x+1) = .9.   -  person    schedule 12.12.2014


Ответы (3)


Казалось бы, сложная проблема...

Это решение для простой расслабленной версии вашей проблемы. Надеюсь, вы сможете использовать некоторые компоненты этого.

Ограничения:

  1. ответ для x должен быть целым числом от 0 до 1000
  2. левая часть выражения должна быть правильным синтаксисом javascript

var input = prompt("enter the equation");  //eg: x*x+x+1=241
var parts = input.split('=');

//solving equation starts
var x = 0;
var temp = eval(parts[0]);
while (temp != parts[1] && x<1000){
   x++;
   temp = eval(parts[0]);
}
var ans = (x<1000)?"answer is "+x:"this program cannot solve this";
//solving equation finishes
  
alert(ans);

Вы можете заменить часть «Решение уравнения» некоторыми численными методами, используемыми в информатике для решения уравнений (подробнее здесь). Вам нужно будет проанализировать левую часть уравнения и сопоставить их с правильными выражениями javascript (в виде строки для выполнения с eval()), если вы хотите, чтобы пользователи могли использовать ваш синтаксис.

person Sampath Liyanage    schedule 11.12.2014
comment
Есть ли способ дать этому более широкий диапазон или спектр рациональных чисел, а не целое число? - person Travis; 13.12.2014
comment
В этом примере x увеличивается на 1 на каждой итерации. Вместо этого вы можете увеличить его на 0,1 или меньше. Правильный способ сделать это — использовать численные методы в информатике (en.wikibooks.org/wiki/Numerical_Methods/Equation_Solving).. - person Sampath Liyanage; 13.12.2014

Javascript может оценивать строки с помощью функции eval, но переменная должна быть определена заранее, а уравнение должно быть отформатировано так, чтобы javascript мог его понять:

var x = 15
var string = "15*x*17/x"
eval(string)

Однако ваш пример: "15*x(5^4-56)*17/x=15" не будет работать, потому что он будет оценивать x(5^4-56) как выражение javascript, что недопустимо.

person Jan Drewniak    schedule 11.12.2014
comment
Вы знаете, что это буквально полная противоположность тому, что я пытаюсь сделать, верно? - person Travis; 12.12.2014
comment
Он хочет решить уравнение, а не вычислить его. - person ; 12.12.2014

Используя всю информацию и другие методы, которые я нашел по этому поводу, я составил ответ сообщества. Всем предлагается изменить и/или добавить свои методы к этому.

Чтобы сделать это с наименьшими усилиями для пользователя и программиста, вы должны реализовать следующий код.

var input = prompt("enter the equation");  //eg: x*x+x+1=241
var parts = input.split('=');

//solving equation starts
var x = 0; //Or the lowest possible value of "x"
var temp = eval(parts[0]);
while (temp != parts[1] && x<1000){ // && x < The highest number to evaluate
   x++; //Add the increment (determines the maximum amount of digits) eg x+0.1 for tenths max, x+2 for only even integers etc.
   temp = eval(parts[0]);
}
var ans = (x<1000)?"answer is "+x:"this program cannot solve this"; //make sure x< is the same as line 7.
//solving equation finishes
  
alert(ans);

Но это работает очень медленно, если вы разрешаете десятые доли или диапазон больше 2000.

Более быстрый способ запустить это — определить массивы, допускающие любую переменную (вместо x) и другой процесс оценки, такой как здесь. (щелкните правой кнопкой мыши по просмотру html и нажмите на первый исходный код js, чтобы увидеть код), но это 2 тыс. строк. Оба пригодны для использования, но второй более эффективен и может решать многомерные уравнения.

person Community    schedule 14.12.2014