数学问题:
利用Simpson算法求解定积分方程
,eps=
解决代码:
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
double fuction(double , int );
double SimpsonIntegral(double, double, double, int);
int main()
{
string l;
double a, b, eps; int num;
cin >> l;
cin >> a >> b;
cin >> eps;
cin >> num;
cout << fixed << setprecision(6) << SimpsonIntegral(a, b, eps, num);
return 0;
}
double fuction(double x, int a)
{
if (a == 1)
return sin(x) / x;
if (a == 2)
return atan(x) / x;
}
double SimpsonIntegral(double a, double b, double eps, int n)
{
if (a == 0) a = 0.0000001;
double h = b - a, s, s1, s2;
int p = 1, k;
s1 = h / 6 * (fuction(a, n) + 4 * fuction((a + b) / 2, n) + fuction(b, n));
s = 2 * fuction(a + 0.25 * h, n) - fuction(a + 0.25 * h, n) + 2 * fuction(a + 0.75 * h, n);
s2 = 0.5 * s1 + s * h / 6;
h = 0.5 * h;
p = 2 * p;
do
{
h = 0.5 * h;
p = 2 * p;
s1 = s2;
s2 = 0;
double q = a, qq = a + h;
for (k = 0; k < p; k++)
{
s2 += h / 6 * (fuction(q, n) + 4 * fuction((q + qq) / 2, n) + fuction(qq, n));
q += h;
qq += h;
}
} while (fabs(s2 - s1) > eps);
return s2;
}
使用方法:
第一行是字符串。
第二行是2个数字,第一个为积分下限:a,第二个为积分上限:b,a、b中间用一个空格相连
第三行是1个精度数,为积分精度:eps
第四行是1个数,为被积函数表达式的序号:funNum。
其中本文代码给出这些函数供选择:
函数fun 序号funNum
sin(x)/x 1
atan(x)/x 2
测试输入:
SimpsonIntegral
0 1
1e-7
1
预期输出:
0.946083
问题解决:
计算结果为: