MATlAB运用——数值积分
實(shí)驗(yàn)一
分別利用變步長(zhǎng)復(fù)化梯形公式、變步長(zhǎng)復(fù)化Simpson公式和復(fù)化Guass-Legendre I型公式計(jì)算下列式子,要求絕對(duì)誤差限為0.5?10?70.5*10^{-7}0.5?10?7,并比較每種算法的計(jì)算時(shí)間。
(1)ln?2?ln?3=?2∫231x2?1dx\ln2-\ln3=-2\int^3_2{1\over x^2-1}dxln2?ln3=?2∫23?x2?11?dx
(2)π=4∫011x2+1dx\pi=4\int^1_0{1\over x^2+1}dxπ=4∫01?x2+11?dx
(3)2ln?3=∫013xdx{2\over \ln3}=\int^1_0 3^xdxln32?=∫01?3xdx
(4)e2=∫12xexdxe^2=\int^2_1xe^xdxe2=∫12?xexdx
1、思路
1.1、變步長(zhǎng)復(fù)化梯形公式和變步長(zhǎng)Simpson公式,是在實(shí)際計(jì)算時(shí),將區(qū)間逐次分半計(jì)算(每分一次就進(jìn)行一次計(jì)算),并利用結(jié)果來(lái)判斷誤差的大小。
對(duì)于變步長(zhǎng)復(fù)化梯形公式,有
- I≈T2n+13(T2n?Tn)I≈T_{2n}+{1\over 3}(T_{2n}-T_n)I≈T2n?+31?(T2n??Tn?)
若∣T2n?Tn∣<ε′=3ε|T_{2n}-T_n|<\varepsilon'=3\varepsilon∣T2n??Tn?∣<ε′=3ε,并取T2nT_{2n}T2n?為積分的近似值。 - 對(duì)于變步長(zhǎng)Simpson公式,有 I≈S2n+115(S2n?Sn)I≈S_{2n}+{1\over 15}(S_{2n}-S_n)I≈S2n?+151?(S2n??Sn?)
若∣S2n?Sn∣<ε′=15ε|S_{2n}-S_n|<\varepsilon'=15\varepsilon∣S2n??Sn?∣<ε′=15ε,并取S2nS_{2n}S2n?為積分的近似值。
1.2、以上兩種,實(shí)際上限定了求積公式的精度。若以求公式的代數(shù)精度達(dá)到最大值的原則去選取求積節(jié)點(diǎn)和求出相應(yīng)的求積系數(shù),那就是Gauss求積公式。以Gauss-Legendre I型求積公式為例子,在區(qū)間[a,b]的復(fù)化積分公式為:
∫baf(x)dx=h2∑k=0n?1[f(xk+12?h23)+f(xk+12+h23)]\int^a_bf(x)dx={h\over 2}\sum_{k=0}^{n-1}[f(x_{k+{1\over2}}-{h\over2\sqrt3})+f(x_{k+{1\over2}}+{h\over2\sqrt3})]∫ba?f(x)dx=2h?∑k=0n?1?[f(xk+21???23?h?)+f(xk+21??+23?h?)]
2、程序
function test_4_1 %分別利用變步長(zhǎng)復(fù)化梯形公式、變步長(zhǎng)復(fù)化Simpson公式、復(fù)化Gauss-Legendre I型公式計(jì)算。 % 絕對(duì)誤差限為1/2*10^(-7) % 將計(jì)算結(jié)果與精確解作比較,并比較各種算法的運(yùn)行時(shí)間 promps={'選擇積分公式,若用變步長(zhǎng)復(fù)化梯形公式,輸入T;用復(fù)化Simpson公式,輸入S;用復(fù)化Gauss_Legendre,輸入GL'}; Nb=char(inputdlg(promps,'text_4_1',1,{'T'})); if (Nb~='T'& Nb~='S'& Nb~='GL')errordlg('積分公式選擇錯(cuò)誤!');return; end Nb_f=str2num(char(inputdlg('輸入積分式子題號(hào)1-4:','text_4_1',1,{'1'}))); if(Nb_f<1'&&Nb_f>4)errordlg('沒(méi)有該積分式子');return; end switch Nb_fcase 1fun=@(x)-2./(x.^2-1);a=2;b=3;case 2fun=@(x)4./(1+x.^2);a=0;b=1;case 3fun=@(x)3.^x;a=0;b=1;case 4fun=@(x)x.*exp(x);a=1;b=2; end r=0.5e-7;%誤差 if (Nb=='T')%變步長(zhǎng)復(fù)化梯形公式tic;t=(fun(a)+fun(b))*(b-a)/2;t0=0;k=1;while abs(t-t0)>=3*r%用區(qū)間逐次分半求積分,T2n-Tn<3rh=(b-a)/(2^k);t0=t;t=(fun(a)+fun(b))*h/2+h*sum(fun(a+h:h:b-h));k=k+1;endtime=toc; elseif (Nb=='S')%變步長(zhǎng)復(fù)化Simpson公式tic;[t,iter]=quad(fun,a,b,r);%quad()函數(shù)是MATLAB自帶的Simpson自適應(yīng)函數(shù)time=toc; elseif (Nb=='GL')%復(fù)化Gauss-Legendre I型公式tic;promps={'請(qǐng)輸入用復(fù)化Gauss-Legendre I型公式應(yīng)取的步長(zhǎng):'};h=str2num(char(inputdlg(promps,'test 4-1',1,{'0.01'})));N=(b-a)/h;t=0;for k=1:N-1xk=a+k*h+h/2;t=t+fun(xk-h/(2*sqrt(3)))+fun(xk+h/(2*sqrt(3)));endt=t*h/2;time=toc; end fprintf('方程(%s)的計(jì)算結(jié)果:%.10f\n',Nb,t); switch Nb_fcase 1result=log(2)-log(3);fprintf('精確解:ln2-ln3=%.10f\n',result);disp(['絕對(duì)誤差:',num2str(abs(t-result))]);disp(['運(yùn)行時(shí)間:',num2str(time)]);case 2result=pi;fprintf('精確解:Π=%.10f\n',result);disp(['絕對(duì)誤差:',num2str(abs(t-result))]);disp(['運(yùn)行時(shí)間:',num2str(time)]);case 3result=2/log(3);fprintf('精確解:2/log(3)=%.10f\n',result);disp(['絕對(duì)誤差:',num2str(abs(t-result))]);disp(['運(yùn)行時(shí)間:',num2str(time)]);case 4result=exp(2);fprintf('精確解:exp(2)=%.10f\n',result);disp(['絕對(duì)誤差:',num2str(abs(t-result))]);disp(['運(yùn)行時(shí)間:',num2str(time)]); end3、運(yùn)行結(jié)果
從結(jié)果可看出,精度最高的是Guass-Legendre I型公式,且步長(zhǎng)取得越小,絕對(duì)誤差越小,但是相應(yīng)所花費(fèi)的時(shí)間越長(zhǎng)。而計(jì)算時(shí)間最短的是變步長(zhǎng)梯形公式,但是其絕對(duì)誤差三者中最大。
絕對(duì)誤差:Guass-Legendre I型公式<變步長(zhǎng)Simpson公式<變步長(zhǎng)復(fù)化梯形公式
計(jì)算時(shí)間:變步長(zhǎng)復(fù)化梯形公式<變步長(zhǎng)Simpson公式<Guass-Legendre I型公式
實(shí)驗(yàn)二
利用復(fù)化Simpson公式和變步長(zhǎng)復(fù)化Simpson公式計(jì)算下列定積分,并比較這兩種算法所需的節(jié)點(diǎn)數(shù)和計(jì)算時(shí)間,要求絕對(duì)誤差限為0.5?10?70.5*10^{-7}0.5?10?7。
(1)∫02((x610?x2+x)dx\int ^2_0(({x^6\over 10}-x^2+x)dx∫02?((10x6??x2+x)dx
(2)∫01xxdx\int^1_0x\sqrt xdx∫01?xx?dx
(3)∫52001xdx\int^{200}_5{1\over \sqrt x}dx∫5200?x?1?dx
1、思路
復(fù)化Simpson公式:
Sn=h6[f(a)+4∑k=0n?1[f(xk+12)+2∑k=1n?1f(xk)+f(b)]S_n={h\over 6}[f(a)+4\sum_{k=0}^{n-1}[f(x_{k+{1\over2}})+2\sum_{k=1}^{n-1} f(x_k)+f(b)]Sn?=6h?[f(a)+4∑k=0n?1?[f(xk+21??)+2∑k=1n?1?f(xk?)+f(b)]
變步長(zhǎng)復(fù)化Simpson公式如實(shí)驗(yàn)一,在MATLAB中可以調(diào)用庫(kù)函數(shù)quad()
2、程序
function test_4_1 promps={'選擇積分公式,用復(fù)化Simpson公式,輸入S;用變步長(zhǎng)復(fù)化Simpson公式,輸入VS'}; Nb=char(inputdlg(promps,'text_4_2',1,{'S'})); if (Nb~='S'& Nb~='VS')errordlg('積分公式選擇錯(cuò)誤!');return; end Nb_f=str2num(char(inputdlg('輸入積分式子題號(hào)1-3:','text_4_2',1,{'1'}))); if(Nb_f<1 &&Nb_f>3)errordlg('沒(méi)有該積分式子');return; end switch Nb_fcase 1fun=@(x)(x.^6/10)-x.^2+x;a=0;b=2;case 2fun=@(x)x.*sqrt(x);a=0;b=1;case 3fun=@(x)1./sqrt(x);a=5;b=200; end r=0.5e-7;%誤差 if (Nb=='S')%復(fù)化Simpson公式tic;promps={'請(qǐng)輸入用復(fù)化Simpson公式應(yīng)取的步長(zhǎng):'};h=str2num(char(inputdlg(promps,'test 4-2',1,{'0.01'})));N=(b-a)/h;t1=0;t2=0;for k=0:N-1xk=a+k*h+h/2;t1=t1+fun(xk);endfor k=1:N-1xk=a+k*h;t2=t2+fun(xk);endt=(1+fun(b)+4*t1+2*t2)*h/6;n=2*N+1;time=toc; elseif (Nb=='VS')%變步長(zhǎng)復(fù)化Simpson公式tic;[t,iter]=quad(fun,a,b,r);n=2*iter+1;time=toc; end fprintf('方程(%s)的計(jì)算結(jié)果:\n',Nb); if (Nb=='S')fprintf('用復(fù)化Simpson公式,所需的節(jié)點(diǎn)數(shù):%d,求得的近似值:%.10f,運(yùn)行時(shí)間:%.5f\n',n,t,time); elseif(Nb=='VS')fprintf('用變步長(zhǎng)復(fù)化Simpson公式,所需的節(jié)點(diǎn)數(shù):%d,求得的近似值:%.10f,運(yùn)行時(shí)間:%.5f\n',n,t,time); end3、運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的MATlAB运用——数值积分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数组指针,指针数组例子解析
- 下一篇: 2020 GMCPC粤澳赛 心得反思