任务是用您喜欢的语言编写一个程序,该程序使用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等。