【发布时间】:2014-10-23 05:06:25
【问题描述】:
我正在尝试使用此公式 在 n 个间隔上实现布尔规则
到目前为止,我已经开发了这段代码:
//f = function on the range [a,b] n = number of intervals
long double booles(long double (*f) (long double),
double a, double b, int n)
{
long double sum=7*f(a); //because the starting value is not doubled
long double h = (b - a)/(n-1); //width of each interval
int mod;
int i =1;
while (i<n-1)
{
mod = i%4;
if (mod==0)
sum+=14*f(a+i*h);
else if (mod==1)
sum+=32*f(a+i*h);
else if (mod==2)
sum+=12*f(a+i*h);
else
sum+=32*f(a+i*h);
++i;
}
return 2* h/45 * sum;
}
这将运行并给出一个体面的答案,但它不在 Bool 错误的规则之内,即错误是 。 我解决了将第一项加倍的问题,但我不确定如何在循环结束附近解决可能的加倍问题。此外,误差相对较大,我不认为我唯一的问题是最后四个术语。
【问题讨论】:
-
完成编辑我最后的答案是代码,您的代码有错误您的系数与公式不匹配... mod==0 大小写应该是
7.0*而不是@987654328 @ ...顺便说一句,这应该标记为您正在使用的C++++i; -
@Spektre 不幸的是,如果我只循环计算一次,这才是正确的。我需要布尔规则的一次迭代的结束与下一次迭代的开始重叠。这是 Simpson 的 3/8 规则来证明重叠的必要性(当没有被循环通过时)![1] (upload.wikimedia.org/math/3/0/0/…)(当被循环通过时)!(2)[upload.wikimedia.org/math/7/5/c/…
标签: c++ c math floating-point-precision integral