我正在研究Android的函数绘图仪项目,其中用户将方程输入为字符串。
这个字符串是使用EvalEx库解决的,我得到了一堆数据点,我使用图形视图库绘制。
现在问题是我给它一个负平方根的方程。例如SQRT(1-x)这会导致错误。
for( i = 0; i < x.length ; i++) {
//the equation solver only takes BigDecimal as input.
x1 = new BigDecimal(x[i]);
try {
// eq is the sting that i got from the EditText.
y1 = new Expression(eq).with("x", x1).eval();
y[i] = y1.floatValue();
} catch(ArithmeticException excp) {
//these are the data points that go into the plot function
x[i] = 0;
y[i] = 0;
}
}
答案 0 :(得分:0)
我仍然有点不清楚你想做什么,但我认为我理解足以给你一个明确的答案。
这就是事情:
eval(...)
函数返回单个值。这就是API所说的。这就是它所能做的一切。你无法避免这一事实。 (没有魔法.....)
因此,如果你想获得两个(真实的)平方根,你需要取SQRT
返回的正结果并自己否定它以获得第二个解决方案。在你的代码中。像这样:
y1 = new Expression("SQRT(3 - x^2)").with("x", x1).eval();
y2 = BigDecimal.ZERO - y1;
当然,这是特殊情况代码 1 。当SQRT
函数可能位于表达式的任何位置时,没有通用代码可以为您提供多个方程式解决方案。
使用EvalEx
API,复杂解决方案的表达式将更加棘手。您无法使用BigDecimal
方法返回的(单个)eval
来表示复杂的解决方案。 (如果你查看代码,取一个负数的平方根会抛出API的ExpressionException
。)
底线是EvalEx
是一个简单,轻量级的表达式评估器。 未设计用于您的用例,包括查找所有解决方案和/或处理复杂数字。并且使现有API适用于这些用例是不可能的。
但好消息是EvalEx的源代码可以在GitHub上找到。
您可以下载它并将其作为编写更复杂的表达式评估程序的起点。
或者......你可以找一个能满足你需要的替代库。
1 - 也就是说,它是通过预先知道我们正在评估的表达式来实现的!此外,x
的值仍为3 - x^2
,而isitapalindromealready = lambda x: "" if isPalindrome(x) else "not"
为负数。