整理复化梯形法复化矩形法变步长梯形变步长辛普森Word文档下载推荐.docx
《整理复化梯形法复化矩形法变步长梯形变步长辛普森Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《整理复化梯形法复化矩形法变步长梯形变步长辛普森Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
#include<
iostream.h>
#include<
math.h>
doublef(doublex)//计算被积函数
{
doubley;
y=log(1+x)/(1+x*x);
//被积函数
returny;
}
doubleTn(doublea,doubleb,intn)//求Tn
doublet=0.0;
doublexk;
//区间端点值
doublet1,t2;
//用来判断精度
do
{
doubleh=(b-a)/n;
for(intk=1;
k<
=n-1;
k++)//每一小段的矩形叠加
{
t1=t;
xk=a+k*h;
t+=h*f(xk);
t2=t;
}
n++;
//如果精度不够就对区间再次细分,直到达到精度要求
while(fabs(t1-t2)<
=1e-7);
//判断计算精度
returnt;
voidmain()
doublea=0.0;
//积分下线
doubleb=2.0;
//积分上限
intn=1024;
//把区间分为1024段
cout<
<
Tn(a,b,n)<
endl;
//输出积分结果
执行结果:
2.复化梯形法
方法和复化矩形法类似,只是把原来的矩形小面积变成了梯形小面积,但是精确度明显提高了,也就是说达到同样的精度需要的时间少了。
变形一下:
doublet1,t2,h=(b-a)/n;
h=(b-a)/n;
k++)//余项叠加,相当于每一个小梯形相加
t+=f(xk);
t=h*(f(a)+f(b))/2+t*h;
//加上初项就是积分结果了
//积分上线
3.变步长梯形法
上面我们在应用复化积分法的时候会对区间进行分割,但是在要求精度是我们也不知道事先应该分割成多少段,分的少了精度达不到,分的多了计算量太大,为了解决这个问题我在上面加了一个循环,来不断地对区间进行再次划分,直到达到精度要求,变步长积分法与我用的方法类似,只不过变步长积分法的区间划分时成倍增加的。
实现方法;
由复化梯形法知道;
步长h=(b-a)/n
现在将步长分半,即在相邻两节点
的中点
处增加一个求积节点,那么
doublef(doublex)//计算被积函数的值
doublet2ntn(doublea,doubleb)
intn=1;
doublehn=b-a;
//原步长
doubletn=0.0;
doublet2n=(f(a)+f(b))*hn/2.0;
while(fabs(t2n-tn)>
1e-7)//判断精度
tn=t2n;
t2n=0.0;
for(intk=0;
k++)//循环叠加
t2n+=f(a+hn/2.0+k*hn);
t2n=tn/2.0+t2n*hn/2.0;
n=n*2;
hn=hn/2.0;
//步长分半
returnt2n;
t2ntn(a,b)<
4.变步长辛普森法
之前的积分斜边都是直线,如果用抛物线接近就会更准确
复化辛普森求积公式
然后就只要每次让他的积分区间加倍就行直到达到要求的精度
stdio.h>
doublea=0.0,b=2.0,e=1e-7;
//积分上下线,和精度要求
intn=1024;
doublef(doublex)
Doubley;
floatsimpson()
inti;
doubles,sn,s2n,p,x,h;
//步长
s=f(a)+f(b);
p=0;
x=a+h;
//积分端点
for(i=1;
i<
i++)
if((i%2)!
=0)
{
p=p+4*f(x);
//在区间中间时乘4
x=x+h;
}
else
s=s+2*f(x);
//积分端点时乘2
s=s+p;
//第一次求和
s2n=s*h/3;
//积分值
do
sn=s2n;
x=a+h/2;
//变步长
s=s-p/2;
p=0;
for(i=1;
=n;
i++)//变步长只需要加就行了
s=s+p;
h=h/2;
s2n=s*h/3;
}while(fabs(s2n-sn)>
e);
//控制精度
returns2n;
{
simpson()<
4.用C++写的综合程序
classBjhs//抽象类
public:
virtualdoublef(doublex)=0;
//虚计算被积函数
virtualvoidprint()=0;
//输出函数
virtualdoubleTn()=0;
//虚函数
};
classFhjx:
publicBjhs//复化矩形法类
Fhjx(){a=0;
b=2;
e=1e-7;
n=1024;
}//构造函数付初值
doublef(doublex);
//计算被积函数
doubleTn()//求Tn
doublet=0.0;
doublexk;
doublet1,t2;
do
doubleh=(b-a)/n;
for(intk=1;
{
t1=t;
xk=a+k*h;
t+=h*f(xk);
t2=t;
n++;
while(fabs(t1-t2)<
=e);
returnt;
voidprint()//输出
{
cout<
"
用复化矩形法计算的结果"
Tn()<
}
private:
doublea,b,e;
intn;
};
doubleFhjx:
:
f(doublex)//外联函数
classFhtx:
publicBjhs//复化梯形法
Fhtx(){a=0;
doublef(doublex);
doubleTn()//求Tn
doublet1,t2,h=(b-a)/n;
{
h=(b-a)/n;
for(intk=1;
{
t1=t;
xk=a+k*h;
t+=f(xk);
t2=t;
}
n++;
while(fabs(t1-t2)<
t=h*(f(a)+f(b))/2+t*h;
returnt;
voidprint()
用复化梯形法计算的结果"
doubleFhtx:
f(doublex)
classBbctx:
publicBjhs//变步长梯形法
public:
Bbctx(){a=0;
n=1;
tn=0;
//计算被积函数的值
doubleTn()
doublehn=b-a;
doublet2n=(f(a)+f(b))*hn/2.0;
while(fabs(t2n-tn)>
e)//判断精度
tn=t2n;
t2n=0.0;
for(intk=0;
t2n+=f(a+hn/2.0+k*hn);
t2n=tn/2.0+t2n*hn/2.0;
n=n*2;
hn=hn/2.0;
returnt2n;
cout<
用变步长梯形法计算的结果"
doubletn;
doubleBbctx:
classBbcxps:
publicBjhs//变步长辛普森法
Bbcxps(){n=1024;
a=0;
}//积分上下线,和精度要求
doublef(doublex);
doubleTn()
=0)//判奇偶,也就是看哪点乘几
}while(fabs(s2n-sn)<
用变步长辛普森法计算的结果"
doublea,b,e,p;
doubleBbcxps:
voiddisplay(Bjhs&
q)//输出函数
q.Tn();
q.print();
voidmain()//选择你想要的方法,用switch语句
chara;
Fhjxb;
安全评价的基本原则是具备国家规定资质的安全评价机构科学、公正和合法地自主开展安全评价。
Fhtxc;
2.量化环境影响后果Bbctxd;
Bbcxpse;
第一节 环境影响评价cout<
求函数y=log(1+x)/(1+x*x)的积分值"
请输入你要选用的方法的编号"
[例题-2005年真题]《中华人民共和国环境影响评价法》规定,建设项目可能造成轻度环境影响的,应当编制( )。
A.复化矩形法B.复化梯形法"
1.环境总经济价值的构成cout<
C.变步长梯形法D.变步长辛普森法"
cin>
>
a;
(2)环境影响后评价。
switch(a){
(3)专项规划环境影响报告书的内容。
除包括上述内容外,还应当包括环境影响评价结论。
主要包括规划草案的环境合理性和可行性,预防或者减轻不良环境影响的对策和措施的合理性与有效性,以及规划草案的调整建议。
case'
A'
display(b);
break;
B'
display(c);
C'
display(d);
(1)生产力变动法case'
D'
display(e);
default:
cout<
输入代码错误"
2.规划环境影响报告书的审查内容}
2.间接市场评估法