數(shù)值計算中用復化梯形公式、復化拋物線公式及龍貝格求積公式求定積分的編程算法
- 資格考試
- 2022-08-07 12:58:54
三道c++編程題,分別用到復化梯形公式和復化辛普生公式、龍貝格算法、R-K算法對方程
第一題:
#include
#include
//復化梯形公式
doubleReiterationOfTrapezoidal(doublea,doubleb,doublen,doublef(doublex))
{
doubleh,fa,fb,xk,t;
h=(b-a)/n;//步長
doubles=0.0;
for(intk=1;k{
xk=a+k*h;
s=s+f(xk);
}
returnh*(f(a)+f(b))/2+h*s;
}
//復化Simpson公式
doubleReiterationOfSimpson(doublea,doubleb,doublen,doublef(doublex))
{
doubleh,fa,fb,xk,xj;
h=(b-a)/n;//步長
doubles1=0.0;
doubles2=0.0;
for(intk=1;k{
xk=a+k*h;
s1=s1+f(xk);
}
for(intj=0;j{
xj=a+(j+0.5)*h;
s2=s2+f(xj);
}
returnh/6*(f(a)+f(b)+2*s1+4*s2);
}
doublefunc(doublex)
{
/*
*1.0->10
*1.1->11
*...
*2.0->20
*/
switch((int)round(x*10))
{
case10:return1;
case11:return.90909;
case12:return.83333;
case13:return.76923;
case14:return.71429;
case15:return.66667;
case16:return.625;
case17:return.58824;
case18:return.55556;
case19:return.52632;
case20:return.5;
}
return0;
}
intmain()
{
//都是分10步積完,從1到2
doubletra=ReiterationOfTrapezoidal(1,2,10,func);
doublesim=ReiterationOfSimpson(1,2,10,func);
printf("Trapezoidal:%f\n",tra);
printf("Simpson:%f\n",sim);
printf("Error:%f\n",(tra-sim));
return0;
}
第二題:
#include
#include
//龍貝格
doubleRomberg(doublea,doubleb,doubleeps,doublef(double))
{
intk=1;
doubleS,x,T1,T2,S1,S2,C1,C2,R1,R2,h=b-a;
T1=h*(f(a)+f(b))/2;
while(1)
{
S=0;x=a+h/2;
do
{
S+=f(x);x+=h;
}while(x T2=(T1+h*S)/2.0;
if(fabs(T2-T1)S2=T2+(T2-T1)/3.0;
if(k==1)
{
T1=T2;S1=S2;h/=2;k+=1;continue;
}
C2=S2+(S2-S1)/15.0;
if(k==2)
{
C1=C2;T1=T2;S1=S2;h/=2.0;k+=1;continue;
}
R2=C2+(C2-C1)/63;
if(k==3)
{
R1=R2;C1=C2;T1=T2;S1=S2;h/=2;k+=1;continue;
}
if(fabs(S1-S2)return(S2);
R1=R2;C1=C2;T1=T2;S1=S2;
h/=2;
k+=1;
return(R1);
}
}
doublefunc(doublex)
{
doublec=cos(x);
returnsqrt(x+c*c);
}
intmain()
{
constdoublepi=3.14159265358979323;
//從1到pi,精度是1e-5
printf("%f\n",Romberg(0,pi,1e-5,func));
return0;
}
MATLAB問題
不知道你的學歷水平是什么樣的,我盡量簡單說
普通積分:
一般來說是找到被積函數(shù)的原函數(shù),然后把上下限帶入求值(定積分)
得到的解是精確解
參見大學課程:《高等數(shù)學》
在matlab中可用函數(shù):int(),求解
數(shù)值積分:
由于在實際工程中絕大多數(shù)的積分都無法找到原函數(shù)
所以,想要得到精確解很困難
為了能夠算出結(jié)果一些大牛(牛頓,高斯等等)搞出了數(shù)值解
即:數(shù)值積分(與精確解的誤差滿足需要)
具體的方法有很多比如:
梯形公式;辛普森公式;遞歸公式;龍貝格積分;自適應積分;高斯-勒讓德積分等等
參見研究生課程:《數(shù)值分析》
在matlab中自帶了一些求數(shù)值積分的函數(shù):
trapz():基于復化梯形公式
integral():求解一元數(shù)值積分
integral2():求解一般區(qū)域二重積分數(shù)值解
integral3():求解一般區(qū)域三重積分數(shù)值解
我個人最常使用——高斯求積法求數(shù)值積分
一般來說取10-20個高斯點即可得到足夠精度的數(shù)值解
最后:請叫我雷鋒!
一道定積分?
題主給出的定積分問題,其被積函數(shù)比較復雜,所以用基本積分公式求解很難得到精確解。但我們可以通過數(shù)值積分的方法(如梯形公式,拋物線公式,龍貝格公式等等),得到其數(shù)值解。
對于題主的被積函數(shù)為x^x的定積分,使用復合拋物線公式,并借助于Excel來求解。
1、將積分限【1,2】分成10等份,即
k=0,1,2,3,。。。,10
2、計算積分計算點,即
x(k)=1,1.1,1.2,。。。,2
3、將被積函數(shù)寫出 f(x)=x^x,并計算其y(k)值
4、根據(jù)復合拋物線公式計算,得到其積分值
5、計算過程如下
數(shù)值計算的構(gòu)造數(shù)值積分
構(gòu)造數(shù)值積分公式最通常的方法是用積分區(qū)間上的n 次插值多項式代替被積函數(shù),由此導出的求積公式稱為插值型求積公式。特別在節(jié)點分布等距的情形稱為牛頓-柯茨公式,例如梯形公式與拋物線公式就是最基本的近似公式。但它們的精度較差。龍貝格算法是在區(qū)間逐次分半過程中,對梯形公式的近似值進行加權(quán)平均獲得準確程度較高的積分近似值的一種方法,它具有公式簡練、計算結(jié)果準確、使用方便、穩(wěn)定性好等優(yōu)點,因此在等距情形宜采用龍貝格求積公式。當用不等距節(jié)點進行計算時,常用高斯型求積公式計算,它在節(jié)點數(shù)目相同情況下,準確程度較高,穩(wěn)定性好,而且還可以計算無窮積分。數(shù)值積分還是微分方程數(shù)值解法的重要依據(jù)。許多重要公式都可以用數(shù)值積分方程導出。
數(shù)值積分的基本思想
數(shù)學上,對于積分
地球物理數(shù)據(jù)處理基礎(chǔ)
只要找到被積函數(shù)f(x)的原函數(shù)F(x),便可得到
地球物理數(shù)據(jù)處理基礎(chǔ)
但在實際使用中,這種方法往往有困難,因為很多的被積函數(shù)找不到用初等函數(shù)表示的原函數(shù),例如 等。在地球物理的實際問題中,被積函數(shù)f(x)往往不清楚或者很復雜,只是通過觀測、測量等獲取了一些離散的值yi=f(xi),即已知的f(x)是一個列表函數(shù),無法求取其原函數(shù)。因此,這類問題就必須依靠數(shù)值積分解決。
對于列表函數(shù)f(x)的積分I*=∫baf(x)dx,當已知f(x)在區(qū)間[a,b]上n+1個節(jié)點a=x0
利用不同的插值多項式的積分可導出不同的求積系數(shù)和求積公式,通常利用分段低階的插值多項式求積應用最廣,表7-1給出了不同數(shù)值積分方法的優(yōu)缺點。復化辛卜生公式和復化梯形公式既簡便易行、容易理解,又具有較高的精度,因此是地球物理計算中的主要的求積方法。高斯公式選點少精度高,是正演計算的求積方法。至于龍貝格算法,只要能加密節(jié)點,就可以達到最快的收斂速度,且每次提高二階逼近的精度,是數(shù)值積分中很巧妙、很優(yōu)秀的方法,但是由于地球物理測量的成本和周期限制觀測點密度是有限的,因而無法發(fā)揮這種算法的優(yōu)勢。樣條求積精度高,是地球物理計算中理想的求積方法?;谶@些原因本章重點介紹復化梯形求積、復化辛卜生求積,至于樣條求積,在第六章樣條插值函數(shù)的基礎(chǔ)上很容易實現(xiàn)。
表7-1 不同求積公式對比表
上一篇
重慶的監(jiān)理員考試時間
下一篇
職稱資格會喪失嗎