Javascript JS:解析x的公式

Javascript JS:解析x的公式,javascript,symbolic-math,Javascript,Symbolic Math,我有一个由几个分量组成的公式,比如说w=x*y/z^2+c。现在每个变量都有一个输入字段。我的目标是,在所有其他人都输入后,尽快计算缺失的一个。困难在于,你们可以选择你们填写的字段和你们想留下的自由字段 简单(天真)的方法当然是手动为每个变量解析它,检测缺少的var,并为每个情况使用单独的js函数。但我甚至还有链接公式(如上面公式中的x也是x=a+b),选项几乎是无限的。JS中是否有任何选项可以通过指定变量求解公式?然后我可以用赋值替换每个变量字符串,然后eval字符串 首先我认为这是个问题,但

我有一个由几个分量组成的公式,比如说
w=x*y/z^2+c
。现在每个变量都有一个输入字段。我的目标是,在所有其他人都输入后,尽快计算缺失的一个。困难在于,你们可以选择你们填写的字段和你们想留下的自由字段

简单(天真)的方法当然是手动为每个变量解析它,检测缺少的var,并为每个情况使用单独的js函数。但我甚至还有链接公式(如上面公式中的x也是
x=a+b
),选项几乎是无限的。JS中是否有任何选项可以通过指定变量求解公式?然后我可以用赋值替换每个变量字符串,然后
eval
字符串

首先我认为这是个问题,但结果证明它只能计算表达式,不能处理方程

这可能吗?还有更好的主意吗

提前谢谢

附言:我的实际公式是:

dR = c * I^2 / A
R = L * dR
P = I * U
DV = R * I
DW = DV * I

它用于计算由于欧姆电阻引起的电缆损耗。每个变量都有一个相应的输入字段。

可以使用以下方法构建用于查找“R”的解决方案。该逻辑可扩展为求解剩余变量。请记住,当前的限制是nerdamer目前只能用代数方法求解三次函数。高阶函数将用数值方法求解

//然后可以处理包含I的非线性。I是二次的
var-dR=nerdamer('R=L*dR')。solveFor('dR');
VarI=nerdamer('dR=c*I^2/A').sub('dR',dR.).solveFor('I');
//你可以先从减少前几个方程开始,因为它们是线性的,你可以把它们作为一个线性系统来求解
var solutions=nerdamer.solveEquations(['P=I*U','DV=R*I','DW=DV*I'],['I','DW','P']);
//解决方案以[variable,value]的形式作为数组返回
//你可以看到它们的样子。在您的情况下,您的所有解决方案都将以DV&U为基础,因为这些是唯一实际已知的解决方案
//您可以看到解决方案是什么样子的
解决方案.map(函数(x){
log('-'+x[0]+'='+x[1]);
});
console.log('------------R------------');
var R=nerdamer.setEquation(I[0],解[0][1])。solveFor('R');
//我将有3个解决方案,因为它是立方的。您可以将它们记录在下面
R.map(函数(x){
log('R='+x.toString());
});


您的确切公式是什么?您需要重写为公式,以便在左边有一个包含每个变量的公式。您可以尝试将公式解析为抽象语法树,然后您可以相对轻松地在AST上进行转换,以便使用其他变量来表示一个特定的变量。@SZenC这就是我的天真解决方案。对于大套的配方来说,这是非常令人厌烦的,而且容易有缺陷。@paramagnetic牛角面包你能告诉我更多吗?一些信息的链接?@3244611用户好吧,我没有任何特定的代码可以指向你……但这里的想法是:一旦你有了AST,你就可以开始遍历一棵树,并通过应用操作的倒数来构建一棵新树。如果您的起始AST类似于
x=y*2+z
,并且您想表达
y
,那么您首先对原始AST进行深度优先遍历,将其转换为
x-z=y*2
(加法的反比是减法),然后
(x-z)/2=y
。这应该是一个非常简单的算法。这看起来很有希望。非常感谢。我以后再仔细看看!没问题。解算方程的结果是否定的,但我已经更新了答案。如果你发现任何错误,请告诉我。