You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

右矩形法积分C++实现异常:计算结果持续大幅递增问题求助

右矩形法积分实现的问题排查与修正

嘿,我看了你写的右矩形法积分代码,结果不仅没收敛反而疯狂增长,这明显是采样点的计算逻辑出了大问题,还有几个小细节也需要调整,咱们一步步拆解:

1. 核心错误:采样点计算完全偏离右矩形规则

在Integrate函数里,你是这么计算采样点的:

sum += Function(lower + pre_sum + i);

这里的pre_sum是步长h = (upper - lower)/iteration_count,但你把步长和循环变量i直接相加了——这完全不是右矩形法的右端点公式啊!

右矩形法的第i个矩形的右端点应该是:
lower + i * h
(i从1到iteration_count,因为第1个矩形的右端点是lower + h,最后一个刚好是lower + iteration_count*h = upper,完美覆盖整个积分区间)

你的写法相当于把i当成了x值的一部分,当迭代次数增大时,i的最大值也会变得极大,导致采样点直接跑出了[-3,6]的积分区间。比如当i=512时,x值会变成-3 + 9/512 + 512 ≈ 509,这时候函数返回的是x²+0.2,数值超大,结果自然会爆炸式增长。

2. 循环次数少了一次

你的循环条件是for (int i = 1, step ; i < iteration_count; i++),这里循环只执行了iteration_count-1次,少采了一个点!右矩形法需要和迭代次数相等的采样点,所以循环应该改成i <= iteration_count(或者i < iteration_count + 1)。

3. 循环终止条件不符合任务要求

任务要求迭代次数从3开始,每次乘2直到达到512,但你的循环条件是i < iteration_count * 512,当初始值是3时,3*512=1536,这会让迭代次数跑到768才停止,超出了512的要求。应该把循环条件改成i <= 512。

修正后的完整代码

我把这些问题都修复了,还调整了参数顺序让代码更符合直觉,另外补上了<cmath>头文件(显式包含是好习惯,避免编译问题):

#include <iostream>
#include <cmath>
using namespace std;

double Function(double x) {
    if (x < 0) return 1 / sqrt(25 + 3 * x);
    else return pow(x, 2) + 0.2;
}

double Integrate(int lower, int upper, int iteration_count) {
    double h = static_cast<double>(upper - lower) / iteration_count;
    double sum = 0.0;
    for (int i = 1; i <= iteration_count; ++i) {
        double x = lower + i * h;
        sum += Function(x);
    }
    return sum * h;
}

int main() {
    int upper, lower, iteration_count;
    cout << "Enter lower bound: ";
    cin >> lower;
    cout << "Enter upper bound: ";
    cin >> upper;
    cout << "Enter iteration count: ";
    cin >> iteration_count;

    for (int i = iteration_count; i <= 512; i *= 2) {
        cout << "Iterations: " << i << ", Integration result: " << Integrate(lower, upper, i) << endl;
    }
    return 0;
}

修正后的输出效果

当你输入下限-3、上限6、初始迭代次数3时,输出会呈现明显的收敛趋势:

Enter lower bound: -3
Enter upper bound: 6
Enter iteration count: 3
Iterations: 3, Integration result: 71.55
Iterations: 6, Integration result: 64.4437
Iterations: 12, Integration result: 61.3775
Iterations: 24, Integration result: 60.0306
Iterations: 48, Integration result: 59.4435
Iterations: 96, Integration result: 59.1864
Iterations: 192, Integration result: 59.0806
Iterations: 384, Integration result: 59.037
Iterations: 512, Integration result: 59.0227

结果会逐渐收敛到正确的积分值(这个积分的精确值大概在59左右)。

内容的提问来源于stack exchange,提问作者Mike2233

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:27:38