如何获得代码以输出来自不同集成方法的结果?

时间:2019-01-31 16:25:12

标签: c++

任务是用您喜欢的语言编写一个程序,该程序使用Simpsons方法和梯形方法来计算n = 10、100、1000、10000的积分。并将这些结果与函数的已知结果进行比较: t ^ -2 / 3 *(1-t)^-1/3。答案是2pi / 3。

这是一门计算物理课程。我不确定我哪里出了问题,但是它不能正常工作。任何帮助,将不胜感激。

#include <iostream>
#include <stdio.h>
#include <math.h>

double simpson(double, double, int);
double trapez(double, double, int);
double ft(double);

using namespace std;

int main()
{
    double a = 0.0, b = 1.0, s = 0, t = 0;
    int n = 10;
    double dt = (b - a) / n;

    for (int i = 1; i <= 4; i +=1)
    {
        s = simpson(a, b, n);
        t = trapez(a, b, n);
        cout << s << " vs " << t << " vs " << "2pi/3 or 2.094395" << endl;
        n = n * 10;
    }

    return 0;
}

double simpson(double as, double bs, int n)
{
    double even_sum = 0, odd_sum = 0, sum = 0;
    double h = (bs - as) / n;

    for (int i = 1; i < n; i += 2) {odd_sum += 4*ft(i*h); }
    for (int i = 2; i < n; i += 2) {even_sum += 2*ft(i*h); }
    sum = even_sum + odd_sum + ft(as) + ft(bs);

    return (h / 3) * sum;
}

double trapez(double at, double bt, int n)
{
    double sumt = 0;
    double h = (bt - at) / n;

    for (int i = 1; i < h; i++) {sumt = 2*ft(at + (i * h)); }
    sumt = sumt + ft(at) + ft(bt);

    return (h / 2) * sumt;
}

double ft(double t)
{
  return (1 / pow(t, 2/3)) * (1 / pow((1 - t), 1/3));

p}

我期望随着n的增加,数字的结果将接近于实际值,但是相反,对于辛普森,我得到的所有输出为1;对于梯形,我得到的所有输出为0.1、0.01、0.001等。

0 个答案:

没有答案