【问题标题】:C++: How to compute an integral with interval bounds?C++:如何计算带区间界限的积分?
【发布时间】:2015-06-05 00:47:12
【问题描述】:

我很累,对 C++ 很陌生,而且在处理多项式方面真的很糟糕。这对我的任务来说是一个糟糕的组合。尽管如此,我正在努力解决它。请注意,我可能在数学和语言方面都误解了某些部分。甚至是术语。

我的第一个任务是创建一个用于存储多项式的类。我认为重要的部分是系数和多项式的次数。因此,我有一个(部分)看起来像这样的多项式类:

class Polynomial {

private:
    double* Coefficients;  //Array of coefficients in order of ascending power
    int Degree; //The degree of the polynomial

...

该类应该有一种方法来求多项式在上下限内的积分。但我真的不知道如何使用它。

由于不展示我所做的事情是不好的做法,这就是我目前所拥有的,它可能没有多大意义,但是如果可以的话,请指出我正确的方向?

Polynomial Polynomial::ComputeIntegral(double lower, double upper) {
    //Values needed to create new polynomial
    //degree will be one more than the original polynomial
    int degree = Degree + 1;
    double* coefficients = new double[degree + 1];

    coefficients[0] = 0;

    for (int i = 0; i < degree +1; i++) {
        coefficients[i + 1] = Coefficients[i] / (double)(i + 1);
    }

    Polynomial integral(degree, coefficients);
    return integral;
}

我可以看到自己,这是一团糟,因为 a) 我不使用边界,b) 我很确定根据分配描述,我最终应该得到一个值而不是一个新的多项式。

Google 告诉我有一些算法可以处理求积分(例如梯形),但我无法将其与我的多项式表示相匹配。

【问题讨论】:

  • 提示:如何将多项式与纸和铅笔相结合?
  • 呃。我不确定如何回答,除了“当我试图与算法集成时”。但同样,我很确定我在解决方案中已经偏离了方向。我曾尝试将我所知道的东西翻译成 C++,但同样,多项式是我在学校时遇到的难题,而 C++ 对我来说是新的。
  • 如果您不知道如何将多项式与纸笔相结合,那么您将如何实现它!
  • 我很清楚您是在告诉我阅读集成主题,而不是尝试编写代码。我想说的是,我无法比现在更进一步。我的问题是我不知道我到底错过了什么。我希望有人能看一下代码,并能够准确地看到我误解了什么。

标签: c++ algorithm integral polynomials


【解决方案1】:

几点建议:

  1. 使用std::vectors 代替指针和new。 (如果您是 C++ 新手,在极少数情况下您真正需要使用new。)
  2. ComputeIntegral(double, double) 需要返回一个双精度值,因为它显然是在计算一个定积分。 (您目前拥有的函数类似于GetPrimitive(),因为它返回多项式的原语,这是另一个多项式。
  3. 定积分是在边界处求值的基元之差(微积分第一基本定理)。
  4. 有多种方法可以将多项式表示为数据结构,但我建议使用单个 std::vector&lt;double&gt; coeffs 来表示直到 poly 次数的所有系数,然后可以在 @ 处计算次数987654327@。但在某些情况下,coeffs 中可能会出现零。

【讨论】:

  • 这很有帮助。谢谢你。我会做更多的研究,看看我想出了什么。
【解决方案2】:

在一般情况下,可以使用boost 库来计算积分:https://www.boost.org/doc/libs/1_77_0/libs/math/doc/html/quadrature.html

还有我用来计算积分的库ALGLIB。下面是一个用ALGLIB计算积分的例子:Integrate a public but non static member function with ALGLIB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 2016-05-05
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 2019-09-05
    • 2017-07-05
    相关资源
    最近更新 更多