积分
参考资料
辛普森积分法
例题
试计算积分:
结果保留至小数点后 位。代码(2)
#include <bits/stdc++.h>
using namespace std;
double a,b,c,d,l,r;
double f1(double x)
{
return c/a*x+(a*d-b*c)/(a*a)*log(fabs(a*x+b));
}
double f2(double x)
{
return c/(b*2)*x*x+d/b*x;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>a>>b>>c>>d>>l>>r;
cout<<fixed<<setprecision(6)<<(a!=0?f1(r)-f1(l):f2(r)-f2(l))<<'\n';
return 0;
}#include <bits/stdc++.h>
#define mid ((l+r)/2)
using namespace std;
const double eps=1e-8;
double a,b,c,d;
double F(double x)
{
return (c*x+d)/(a*x+b);
}
double simp(double l,double r)
{
return (F(l)+F(r)+F(mid)*4)*(r-l)/6;
}
double asr(double l,double r,double e,double ans)
{
double L=simp(l,mid),R=simp(mid,r);
if(fabs(L+R-ans)<=e*15)return L+R+(L+R-ans)/15;
return asr(l,mid,e/2,L)+asr(mid,r,e/2,R);
}
double calc(double l,double r,double e)
{
return asr(l,r,e,simp(l,r));
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
double l,r;
cin>>a>>b>>c>>d>>l>>r;
cout<<fixed<<setprecision(6)<<calc(l,r,eps)<<'\n';
return 0;
}
给定实数 ,计算积分 。若积分发散,请输出 orz。()代码(1)
#include <bits/stdc++.h>
#define mid ((l+r)/2)
using namespace std;
const double eps=1e-8;
double a;
double F(double x)
{
return pow(x,a/x-x);
}
double simp(double l,double r)
{
return (F(l)+F(r)+F(mid)*4)*(r-l)/6;
}
double asr(double l,double r,double e,double ans)
{
double L=simp(l,mid),R=simp(mid,r);
if(fabs(L+R-ans)<=e*15)return L+R+(L+R-ans)/15;
return asr(l,mid,e/2,L)+asr(mid,r,e/2,R);
}
double calc(double l,double r,double e)
{
return asr(l,r,e,simp(l,r));
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>a;
if(a<0)cout<<"orz"<<'\n';
else cout<<fixed<<setprecision(5)<<calc(eps,20,eps)<<'\n';
return 0;
}