在Java中有没有一种简单的方法来检查函数/表达式的线性度?

在Java中有没有一种简单的方法来检查函数/表达式的线性度?,java,math,Java,Math,我试图找到一种方法或一个库来检查函数/表达式是否是线性的 我知道,我可以编写一个语法检查fpr,它是线性函数的标准形式。 挑战在于,可能是输入没有标准化 例如: 2x+1 可能是 (x+1)^2-x^2 如果有人知道一个简单的方法让它工作,我会很高兴的 更新1: 解决方案应适用于具有1..n个变量的函数/表达式。如果近似值良好,最简单、通用的方法是在随机点计算函数,然后检查输出中的线性变化。 i、 e 生成n个随机点x_0,x_1。。。x_n 对于每个不同的对(x_i,x_j),检查(f(x_

我试图找到一种方法或一个库来检查函数/表达式是否是线性的

我知道,我可以编写一个语法检查fpr,它是线性函数的标准形式。 挑战在于,可能是输入没有标准化

例如: 2x+1

可能是

(x+1)^2-x^2

如果有人知道一个简单的方法让它工作,我会很高兴的

更新1:
解决方案应适用于具有1..n个变量的函数/表达式。

如果近似值良好,最简单、通用的方法是在随机点计算函数,然后检查输出中的线性变化。 i、 e

  • 生成n个随机点
    x_0,x_1。。。x_n
  • 对于每个不同的对
    (x_i,x_j)
    ,检查
    (f(x_i)-f(x_j))/(x_j-x_i)
    是否(几乎)恒定

如果近似值很好,最简单、通用的方法是在随机点评估函数,然后检查输出中的线性变化。 i、 e

  • 生成n个随机点
    x_0,x_1。。。x_n
  • 对于每个不同的对
    (x_i,x_j)
    ,检查
    (f(x_i)-f(x_j))/(x_j-x_i)
    是否(几乎)恒定

如果输入没有标准化,那么您需要实现一个方程求解器(就像wolframalpha.com上的那样),这并不容易。你最好的选择可能是找到一个为你做这件事的库。好吧,这取决于你的解决方案需要多少通用性。一般来说,您需要编写大量代数代码或导入库或其他内容,例如,调用使用ABCL(JVM的公共Lisp)编译的Maxima。(顺便问一下,Java真的是一种需求吗?如果不是,你有更广泛的选择。)但也许只需要找到输入中每个变量的程度就足够了。如果度是0或1,并且没有变量的乘积,那么它是线性的。一个人几乎可以用一些可怕的正则表达式来完成它。同样,这取决于解决方案的通用性。如果输入没有标准化,那么你需要实现一个方程求解器(就像他们在wolframalpha.com上所做的那样),这并不容易。你最好的选择可能是找到一个为你做这件事的库。好吧,这取决于你的解决方案需要多少通用性。一般来说,您需要编写大量代数代码或导入库或其他内容,例如,调用使用ABCL(JVM的公共Lisp)编译的Maxima。(顺便问一下,Java真的是一种需求吗?如果不是,你有更广泛的选择。)但也许只需要找到输入中每个变量的程度就足够了。如果度是0或1,并且没有变量的乘积,那么它是线性的。一个人几乎可以用一些可怕的正则表达式来完成它。同样,这取决于解决方案的通用性。谢谢你的快速回答,我以前也考虑过这个问题,但我不知道这是否适用于具有多个变量的函数。@Bömmel是的,它工作得很好。一般来说,你需要做一些主成分分析之类的工作来评估线性度。@Bömmel但是,如果你关心具有多个变量的函数,请在你的问题中这样说。@Bömmel是的,它应该可以工作,但会更复杂,可能太慢。所以你要做的是生成N个坐标(x,y)(而不是之前的x),并确保所有的值f(x_i,y_i)都位于N维平面而不是直线上。我忘了怎么做了,好久不见了。但是你可以查一下。谢谢你的快速回答,我以前一直在考虑这个问题,但我不知道这是否适用于具有多个变量的函数。@Bömmel是的,它工作得很好。一般来说,你需要做一些主成分分析之类的工作来评估线性度。@Bömmel但是,如果你关心具有多个变量的函数,请在你的问题中这样说。@Bömmel是的,它应该可以工作,但会更复杂,可能太慢。所以你要做的是生成N个坐标(x,y)(而不是之前的x),并确保所有的值f(x_i,y_i)都位于N维平面而不是直线上。我忘了怎么做了,好久不见了。但是你可以查一下。