【问题标题】:How do I pass in a polynomial function in java?如何在java中传递多项式函数?
【发布时间】:2013-03-04 18:38:11
【问题描述】:

对于一个微积分编程项目,我们被要求编写一个模拟辛普森 1/3 和 3/8 规则的程序。

我们应该采用多项式(即 5x^2+7x+10),但我正在努力将其概念化。我已经开始使用扫描仪,但有没有更好的方法来正确读取多项式?

任何示例或参考资料将不胜感激。

【问题讨论】:

  • 在一个列表中,索引告诉您该数字的程度如何? (示例列表[10,7,5])
  • 或者您是在问如何解析用户输入以获得多项式?
  • 我相信解析是我的问题。我对java有点陌生,所以这让我很困扰。
  • @gtgaxiola 这是个好主意。 list[i] 给出了x^i 的系数。
  • @bakoyaro 非常感谢!我对这种类型的网站完全陌生,我感谢上面的所有输入。我将查找您建议的 Map 技术。再次感谢您!

标签: java calculus


【解决方案1】:

我建议您从一个函数接口开始,该接口接受多个输入值并返回一个输出值:

public interface Function {
    double evaluate(double x);
}

写一个多项式实现:

public class Poly {

    public static double evaluate(double x, double [] coeffs) {
        double value = 0.0;
        if (coeffs != null) {
            // Use Horner's method to evaluate.
            for (int i = coeffs.length-1; i >= 0; --i) {
                value = coeffs[i] + (x*value);
            }
        }
        return value;
    }
}

将它传递给您的集成商,让它完成它的工作。

【讨论】:

  • 在您的示例中,我可以很好地传递与用户输入的函数一致的系数,而不是硬编码值(10.0、7.0、5.0),对吗?
【解决方案2】:

一种简单的方法(帮助您入门)是使用数组。
在您的示例中:5x^2 + 7x + 10 将是:
{10,7,5}
IE。在索引 0 处是 x^0 的因数 10 在索引 1 处是 7 对于 x^1 在索引 2 处是 10 对于 x^2。

当然这不是最好的方法。要想办法弄清楚你将如何代表x^20

【讨论】:

  • 非常感谢 Cratylus 我会尝试这种方法!也谢谢你@Sotirios Delimanolis
【解决方案3】:

在 java 中,最简单的方法是预先格式化您的输入并要求输入常量——例如,“请输入 X^2 项”(然后是 X 项,然后是常量)。

如果这不可接受,您将很容易受到输入样式差异的影响。您可以通过 + 和 - 上的 String.split[ting] 来分隔这些术语,这将给您留下如下内容:

[5x^2]、[7x]、[10]

然后您可以搜索包含“x^2”和“x”的字符串来区分您的术语

当然,首先删除空格和 .toLowerCase() 以应对用户差异。

当您拆分字符串时,您需要识别 - 情况,以便您可以否定这些常量。

您可以进行两次拆分,一个在 + 上,另一个在 - 上。您也可以使用 StringTokenizer 并选择保留“令牌”,这可能更直接,但 StringTokenizer 会让一些人有点不舒服,所以选择适合您的任何东西。

请注意,即使用户键入“5x^2 + 10 + 7 x”也会成功,这很方便。

【讨论】:

  • 如果多项式的类型不受指数限制怎么办?所以输入可能是一个函数(4x^7 + 10x^4 +3x + 10)或(x^3)?
  • 您必须对输入做出一些假设或构建一个通用计算器。你做的假设越多,就越容易。您建议的输入不会造成任何困难,只需稍作修改即可消除功率和常数...
【解决方案4】:

我相信解析是我的问题。我对java有点陌生,所以这让我很困扰。

您应该使用parser generator。

解析器生成器是一种读取语法规范并将其转换为可以识别语法匹配的 Java 程序的工具。除了解析器生成器本身之外,JavaCC 还提供与解析器生成相关的其他标准功能,例如树构建(通过 JavaCC 附带的名为 JJTree 的工具)、操作、调试等。

JavaCC 的常见问题解答How do I parse arithmetic expressions?

查看 JavaCC 附带的示例。

查看有关编译的任何文本。

参见Parsing Epressions by Recursive Descent 和Theodore Norvell 的教程。

另外,请参阅JavaCC - Parse math expressions into a class structure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2018-06-10
    • 2019-06-04
    相关资源
    最近更新 更多