Възможно ли е да конвертирате низ, който е уравнение с променлива, в уравнение?

Трябва да преобразувам низ, върнат от 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 източник, за да видите кода), но това е 2k реда. И двете са приложими, но втората е по-ефективна и може да решава многовариантни уравнения.

person Community    schedule 14.12.2014