C++:如何计算具有区间边界的积分?
C++: How to compute an integral with interval bounds?
我既累又不熟悉 C++,而且非常不擅长处理多项式。这对我的任务来说是一个糟糕的组合。尽管如此,我正在努力解决它。请注意,我可能在数学和语言方面误解了某些部分。甚至术语。
我的第一个任务是创建一个 class 来存储多项式。我认为重要的部分是系数和多项式的次数。因此,我有一个多项式 class ,(部分)看起来像这样:
class Polynomial {
private:
double* Coefficients; //Array of coefficients in order of ascending power
int Degree; //The degree of the polynomial
...
class 应该有一种方法可以在下限和上限内找到多项式的积分。但是我真的不知道怎么用。
因为不展示我所做的是不好的做法,这就是我目前拥有的,它可能没有多大意义,但是如果可以的话,请给我指明正确的方向?
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 告诉我有一些算法可以处理求积分(例如梯形),但我无法将其与我的多项式表示相匹配。
一些提示:
- 使用
std::vector
代替指针和new
。 (如果您是 C++ 新手,实际需要使用 new
的情况非常少。)
ComputeIntegral(double, double)
需要 return 一个双精度数,因为它显然是在计算定积分。 (您现在拥有的函数类似于 GetPrimitive()
,因为它 return 是多项式的原语,它是另一个多项式。
- 定积分是原语在边界处的差值(微积分第一基本定理)。
- 有多种方法可以将多项式表示为数据结构,但我建议使用一个
std::vector<double> coeffs
来表示所有系数,直至多项式的阶数,然后阶数可以在 coeffs.size()
计算。但在某些情况下,coeffs
中可能有零。
在一般情况下,可以使用 boost
库来计算积分:https://www.boost.org/doc/libs/1_77_0/libs/math/doc/html/quadrature.html
还有我用来计算积分的库 ALGLIB
。下面是使用 ALGLIB
计算积分的示例:
我既累又不熟悉 C++,而且非常不擅长处理多项式。这对我的任务来说是一个糟糕的组合。尽管如此,我正在努力解决它。请注意,我可能在数学和语言方面误解了某些部分。甚至术语。
我的第一个任务是创建一个 class 来存储多项式。我认为重要的部分是系数和多项式的次数。因此,我有一个多项式 class ,(部分)看起来像这样:
class Polynomial {
private:
double* Coefficients; //Array of coefficients in order of ascending power
int Degree; //The degree of the polynomial
...
class 应该有一种方法可以在下限和上限内找到多项式的积分。但是我真的不知道怎么用。
因为不展示我所做的是不好的做法,这就是我目前拥有的,它可能没有多大意义,但是如果可以的话,请给我指明正确的方向?
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 告诉我有一些算法可以处理求积分(例如梯形),但我无法将其与我的多项式表示相匹配。
一些提示:
- 使用
std::vector
代替指针和new
。 (如果您是 C++ 新手,实际需要使用new
的情况非常少。) ComputeIntegral(double, double)
需要 return 一个双精度数,因为它显然是在计算定积分。 (您现在拥有的函数类似于GetPrimitive()
,因为它 return 是多项式的原语,它是另一个多项式。- 定积分是原语在边界处的差值(微积分第一基本定理)。
- 有多种方法可以将多项式表示为数据结构,但我建议使用一个
std::vector<double> coeffs
来表示所有系数,直至多项式的阶数,然后阶数可以在coeffs.size()
计算。但在某些情况下,coeffs
中可能有零。
在一般情况下,可以使用 boost
库来计算积分:https://www.boost.org/doc/libs/1_77_0/libs/math/doc/html/quadrature.html
还有我用来计算积分的库 ALGLIB
。下面是使用 ALGLIB
计算积分的示例: