MATLAB數值積分法


MATLAB數值積分法

作者:凱魯嘎吉 - 博客園
http://www.cnblogs.com/kailugaji/

一、實驗目的

許多工程技術和數學研究中要用到定積分,如果無法直接算不出精確值(如含在積分方程中的積分)或計算困難但可用近似值近似時,就用數值積分法方法加以解決。常用的算法有:復化梯形、辛甫生(Simpson)、柯特斯(Cotes)求積法; 龍貝格(Romberg)算法;高斯(Gauss)算法。

二、實驗原理

三、實驗程序

下面給出復化Simpson求積法程序(梯形及柯特斯復化求積分程序可比照編制):

四、實驗內容

選一可精確算值的定積分,用復化的梯形法及復化Simpson求積法作近似計算,並比較結果。

五、解答

1.(程序)

xps.m:

function y=xps(x)
y=x^(3/2);

復化梯形公式:

   trap.m:

function [T,Y,esp]=trap(a,b,n)
h=(b-a)/n;
T=0;
for i=1:(n-1)
    x=a+h*i;
    T=T+xps(x);
end
T=h*(xps(a)+xps(b))/2+h*T;
syms x
Y=vpa(int(xps(x),x,a,b),8);
esp=abs(Y-T);

復化辛甫生(Simpson)公式:

   simpson.m:

function [SI,Y,esp]=simpson(a,b,m)
%a,b為區間左右端點,xps(x)為求積公式,m*2等分區間長度
h=(b-a)/(2*m);
SI0=xps(a)+xps(b);
SI1=0;
SI2=0;
for i=1:((2*m)-1)
    x=a+i*h;
    if mod(i,2)==0
        SI2=SI2+xps(x);
    else 
        SI1=SI1+xps(x);
    end
end
SI=h*(SI0+4*SI1+2*SI2)/3;
syms x
Y=vpa(int(xps(x),x,a,b),8);
esp=abs(Y-SI);

2.(運算結果)

>> [T,Y,esp]=trap(1,2,8)

T =

    1.8636

 
Y =
 
1.8627417
 
 
esp =
 
0.0008089288247354886607354274019599
>> [SI,Y,esp]=simpson(1,2,8)

SI =

    1.8627

 
Y =
 
1.8627417
 
 
esp =
 
0.000000020499792974248975951923057436943

從計算結果看:復化辛普森公式更精確。

3.(拓展(方法改進、體會等))

MATLAB有一些內置函數,用於實施自適應求積分,都是根據GanderGautschi構造的算法編寫的。

quad:使用辛普森求積,對於低精度或者不光滑函數效率更高

quadl:該函數使用了稱為洛巴托求積(Lobatto Quadrature)的算法,對於高精度和光滑函數效率更高

使用方法:

I=quad(func,a,b,tol);

func是被積函數,ab是積分限,tol是期望的絕對誤差(如果不提供,默認為1e-6

例如對於函數f=xe^x[0,3]上求積分,顯然可以通過解析解知道結果是2e^3+1=41.171073846375336

先創建一個M文件xex.m

內容如下:

function f=xex(x)

f=x.*exp(x);

然后調用:

>> format long

>> format compact

>> quad(@xex,0,3)

ans =

  41.171073850902332

可見有9位有效數字,精度還是蠻高的。

如果使用quadl

>> quadl(@xex,0,3)

ans =

  41.171074668001779

反而只有7位有效數字


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM