復(fù)化梯形法-復(fù)化矩形法-變步長(zhǎng)梯形-變步長(zhǎng)辛普森_第1頁(yè)
復(fù)化梯形法-復(fù)化矩形法-變步長(zhǎng)梯形-變步長(zhǎng)辛普森_第2頁(yè)
復(fù)化梯形法-復(fù)化矩形法-變步長(zhǎng)梯形-變步長(zhǎng)辛普森_第3頁(yè)
復(fù)化梯形法-復(fù)化矩形法-變步長(zhǎng)梯形-變步長(zhǎng)辛普森_第4頁(yè)
復(fù)化梯形法-復(fù)化矩形法-變步長(zhǎng)梯形-變步長(zhǎng)辛普森_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

陜西科技大學(xué)機(jī)械教改班用C++的積分其實(shí)積分的思想就是,微分—>求和—>取極限,如果是用純手工法那就是先對(duì)一個(gè)函數(shù)微分,再求出它的面積,在取極限,因?yàn)槲覀兊挠?jì)算速度和計(jì)算量有限,現(xiàn)在有了計(jì)算機(jī)這個(gè)速度很快的機(jī)器,我們可以把微分后的每個(gè)小的面積加起來,為了滿足精度,我們可以加大分區(qū),即使實(shí)現(xiàn)不了微分出無限小的極限情況,我們也至少可以用有限次去接近他,下面我分析了四種不同的積分方法,和一個(gè)綜合通用程序。一.積分的根本思想1、思路:微分—>求和—>取極限。2、Newton—Leibniz公式其中,被積函數(shù)的原函數(shù)。3、用計(jì)算機(jī)積分的思路在積分區(qū)間內(nèi)“微分—>求和—>控制精度〞。因?yàn)橛?jì)算機(jī)求和不可以取極限,也就是不可以無限次的加下去,所以要控制精度。二.現(xiàn)有的理論1、一階求積公式---梯形公式他只能精確計(jì)算被積函數(shù)為0、1次多項(xiàng)式時(shí)的積分。2、二階求積分公式——牛頓、科特斯公式他只能精確計(jì)算被積函數(shù)為0、1、2、3次多項(xiàng)式時(shí)的積分。四種實(shí)現(xiàn)方法復(fù)化矩形法將積分區(qū)間[a,b]等分成n個(gè)子區(qū)間:那么h=(b-a)/n,區(qū)間端點(diǎn)值=a+kh............................源程序:#include<iostream.h>#include<math.h>doublef(doublex)//計(jì)算被積函數(shù){ doubley; y=log(1+x)/(1+x*x);//被積函數(shù) returny;}doubleTn(doublea,doubleb,intn)//求Tn{ doublet=0.0; doublexk;//區(qū)間端點(diǎn)值 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++;//如果精度不夠就對(duì)區(qū)間再次細(xì)分,直到到達(dá)精度要求 } while(fabs(t1-t2)<=1e-7);//判斷計(jì)算精度 returnt;}voidmain(){ doublea=0.0;//積分下線 doubleb=2.0;//積分上限 intn=1024;//把區(qū)間分為1024段 cout<<Tn(a,b,n)<<endl;//輸出積分結(jié)果}執(zhí)行結(jié)果:復(fù)化梯形法方法和復(fù)化矩形法類似,只是把原來的矩形小面積變成了梯形小面積,但是精確度明顯提高了,也就是說到達(dá)同樣的精度需要的時(shí)間少了。變形一下:源程序:#include<iostream.h>#include<math.h>doublef(doublex)//計(jì)算被積函數(shù){ doubley; y=log(1+x)/(1+x*x);//被積函數(shù) returny;}doubleTn(doublea,doubleb,intn)//求Tn{ doublet=0.0; doublexk;//區(qū)間端點(diǎn)值 doublet1,t2,h=(b-a)/n;//用來判斷精度do { h=(b-a)/n; for(intk=1;k<=n-1;k++)//余項(xiàng)疊加,相當(dāng)于每一個(gè)小梯形相加 { t1=t; xk=a+k*h; t+=f(xk); t2=t; } n++;//如果精度不夠就對(duì)區(qū)間再次細(xì)分,直到到達(dá)精度要求 } while(fabs(t1-t2)<=1e-7);//判斷計(jì)算精度t=h*(f(a)+f(b))/2+t*h; //加上初項(xiàng)就是積分結(jié)果了 returnt;}voidmain(){ doublea=0.0;//積分下線 doubleb=2.0;//積分上線 intn=1024;//把區(qū)間分為1024段 cout<<Tn(a,b,n)<<endl;//輸出積分結(jié)果}執(zhí)行結(jié)果:變步長(zhǎng)梯形法上面我們?cè)趹?yīng)用復(fù)化積分法的時(shí)候會(huì)對(duì)區(qū)間進(jìn)行分割,但是在要求精度是我們也不知道事先應(yīng)該分割成多少段,分的少了精度達(dá)不到,分的多了計(jì)算量太大,為了解決這個(gè)問題我在上面加了一個(gè)循環(huán),來不斷地對(duì)區(qū)間進(jìn)行再次劃分,直到到達(dá)精度要求,變步長(zhǎng)積分法與我用的方法類似,只不過變步長(zhǎng)積分法的區(qū)間劃分時(shí)成倍增加的。實(shí)現(xiàn)方法;由復(fù)化梯形法知道;步長(zhǎng)h=(b-a)/n現(xiàn)在將步長(zhǎng)分半,即在相鄰兩節(jié)點(diǎn)的中點(diǎn)處增加一個(gè)求積節(jié)點(diǎn),那么變形一下:源程序:#include<iostream.h>#include<math.h>doublef(doublex)//計(jì)算被積函數(shù)的值{ doubley; y=log(1+x)/(1+x*x); returny;}doublet2ntn(doublea,doubleb){ intn=1; doublehn=b-a;//原步長(zhǎng) 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<=n-1;k++)//循環(huán)疊加 t2n+=f(a+hn/2.0+k*hn); t2n=tn/2.0+t2n*hn/2.0; n=n*2; hn=hn/2.0;//步長(zhǎng)分半 } returnt2n;}voidmain(){ doublea=0.0; doubleb=2.0; cout<<t2ntn(a,b)<<endl;}執(zhí)行結(jié)果:變步長(zhǎng)辛普森法之前的積分斜邊都是直線,如果用拋物線接近就會(huì)更準(zhǔn)確復(fù)化辛普森求積公式然后就只要每次讓他的積分區(qū)間加倍就行直到到達(dá)要求的精度#include<stdio.h>#include<iostream.h>#include<math.h>doublea=0.0,b=2.0,e=1e-7;//積分上下線,和精度要求intn=1024;doublef(doublex){ Doubley; y=log(1+x)/(1+x*x);//被積函數(shù) returny;}floatsimpson(){ inti; doubles,sn,s2n,p,x,h; h=(b-a)/n;//步長(zhǎng) s=f(a)+f(b); p=0; x=a+h;//積分端點(diǎn) for(i=1;i<=n-1;i++) { if((i%2)!=0) { p=p+4*f(x);//在區(qū)間中間時(shí)乘4 x=x+h; } else { s=s+2*f(x);//積分端點(diǎn)時(shí)乘2 x=x+h; } } s=s+p;//第一次求和 s2n=s*h/3;//積分值 do { sn=s2n; x=a+h/2;//變步長(zhǎng) s=s-p/2; p=0; for(i=1;i<=n;i++)//變步長(zhǎng)只需要加就行了 { p=p+4*f(x); x=x+h; } s=s+p; n=n*2; h=h/2; s2n=s*h/3; }while(fabs(s2n-sn)>e);//控制精度 returns2n;}voidmain(){ cout<<simpson()<<endl;}執(zhí)行結(jié)果:用C++寫的綜合程序#include<stdio.h>#include<iostream.h>#include<math.h>classBjhs//抽象類 { public: virtualdoublef(doublex)=0;//虛計(jì)算被積函數(shù) virtualvoidprint()=0;//輸出函數(shù) virtualdoubleTn()=0;//虛函數(shù) }; classFhjx:publicBjhs//復(fù)化矩形法類 { public: Fhjx(){a=0;b=2;e=1e-7;n=1024;}//構(gòu)造函數(shù)付初值 doublef(doublex);//計(jì)算被積函數(shù) doubleTn()//求Tn { doublet=0.0; doublexk;//區(qū)間端點(diǎn)值 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++;//如果精度不夠就對(duì)區(qū)間再次細(xì)分,直到到達(dá)精度要求 } while(fabs(t1-t2)<=e);//判斷計(jì)算精度 returnt; } voidprint()//輸出 { cout<<"用復(fù)化矩形法計(jì)算的結(jié)果"<<Tn()<<endl; }private: doublea,b,e; intn;};doubleFhjx::f(doublex)//外聯(lián)函數(shù){ doubley; y=log(1+x)/(1+x*x);//被積函數(shù) returny;}classFhtx:publicBjhs//復(fù)化梯形法{ public: Fhtx(){a=0;b=2;e=1e-7;n=1024;} doublef(doublex);//計(jì)算被積函數(shù) doubleTn()//求Tn { doublet=0.0; doublexk;//區(qū)間端點(diǎn)值 doublet1,t2,h=(b-a)/n;//用來判斷精度 do { h=(b-a)/n; for(intk=1;k<=n-1;k++)//余項(xiàng)疊加,相當(dāng)于每一個(gè)小梯形相加 { t1=t; xk=a+k*h; t+=f(xk); t2=t; } n++;//如果精度不夠就對(duì)區(qū)間再次細(xì)分,直到到達(dá)精度要求 } while(fabs(t1-t2)<=1e-7);//判斷計(jì)算精度 t=h*(f(a)+f(b))/2+t*h; //加上初項(xiàng)就是積分結(jié)果了 returnt; } voidprint() { cout<<"用復(fù)化梯形法計(jì)算的結(jié)果"<<Tn()<<endl; }private: doublea,b,e; intn;};doubleFhtx::f(doublex){ doubley; y=log(1+x)/(1+x*x);//被積函數(shù) returny;}classBbctx:publicBjhs//變步長(zhǎng)梯形法{public:Bbctx(){a=0;b=2;e=1e-7;n=1;tn=0;} doublef(doublex);//計(jì)算被積函數(shù)的值doubleTn() { doublehn=b-a;//原步長(zhǎng) doublet2n=(f(a)+f(b))*hn/2.0; while(fabs(t2n-tn)>e)//判斷精度 { tn=t2n; t2n=0.0; for(intk=0;k<=n-1;k++)//循環(huán)疊加 t2n+=f(a+hn/2.0+k*hn); t2n=tn/2.0+t2n*hn/2.0; n=n*2; hn=hn/2.0;//步長(zhǎng)分半 } returnt2n; } voidprint() { cout<<"用變步長(zhǎng)梯形法計(jì)算的結(jié)果"<<Tn()<<endl; }private: doublea,b,e;doubletn; intn;};doubleBbctx::f(doublex){ doubley; y=log(1+x)/(1+x*x);//被積函數(shù) returny;}classBbcxps:publicBjhs//變步長(zhǎng)辛普森法{public: Bbcxps(){n=1024;a=0;b=2;e=1e-7;}//積分上下線,和精度要求doublef(doublex);doubleTn(){ inti; doubles,sn,s2n,p,x,h; h=(b-a)/n;//步長(zhǎng) s=f(a)+f(b); p=0; x=a+h;//積分端點(diǎn) for(i=1;i<=n-1;i++) { if((i%2)!=0)//判奇偶,也就是看哪點(diǎn)乘幾 { p=p+4*f(x);//在區(qū)間中間時(shí)乘4 x=x+h; } else { s=s+2*f(x);//積分端點(diǎn)時(shí)乘2 x=x+h; } } s=s+p;//第一次求和 s2n=s*h/3;//積分值 do { sn=s2n; x=a+h/2;//變步長(zhǎng) s=s-p/2; p=0; for(i=1;i<=n;i++)//變步長(zhǎng)只需要加就行了 { p=p+4*f(x); x=x+h; } s=s+p; n=n*2; h=h/2; s2n=s*h/3; }while(fabs(s2n-sn)<=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論