数值计算实验报告---复合求积公式(梯形、抛物线、龙贝格)、导数求值(三点、四点、五点公式)

 

----------------------个人作业,如果有后辈的作业习题一致,可以参考学习,一起交流,请勿直接copy

         ··复合抛物线公式:

           ··龙贝格公式:

四、实验内容

------1  

实验题目1中所用到的三种算法的matlab实现代码具体如下:

 

%复合梯形公式

function y=funct(f,n,a,b)   

fi=f(a)+f(b);

h=(b-a)/n;

d=1;

for i=1:n-1

    x=a+i*h;

    fi=fi+2*f(x);

    d=d+1;

end

f4=h/2*fi,d

 

%复合抛物线公式

function y=funcp(f,n,a,b)   

h=(b-a)/n;

f1=0;

f2=0;

dd=1;

for i=1:n-1

    dd=dd+1;

if  rem(i,2)~=0;

          x1=a+i*h;

      f1=f1+f(x1);

else

      rem(i,2)==0;

      x2=a+i*h;

      f2=f2+f(x2)

end

end

f3=(h/3)*(f(a)+4*f1+2*f2+f(b)),dd

 

%龙贝格公式

function y=romberg(f,n,a,b)   

    z=zeros(n,n);

    h=b-a;

    z(1,1)=(h/2)*(f(a)+f(b));

    f1=0;

    for i=2:n

for  k=1:2^(i-2)

             f1=f1+f(a+(k-0.5)*h);

end

        z(i,1)=0.5*z(i-1,1)+0.5*h*f1;

h=h/2;

f1=0;

for  j=2:i

             z(i,j)=z(i,j-1)+(z(i,j-1)-z(i-1,j-1))/(4^(j-1)-1);

end

    end

 z,n

------2

实验题目2中所用到的三种算法的matlab实现代码具体如下:

 

 

%采用三点公式法求函数func在x0处的二阶导数

function df= ThreePoint2(func,x0,type,h)

%函数名: func

%求导点: x0

%三点公式法的形式: type

%步长:h

%导数值: df

if nargin == 3

    h = 0.1;

else if (nargin == 4 && h == 0.0)

        disp(' h不能为0!');

        return;

    end

end

for i=1:5

     y(i) = subs(sym(func), findsym(sym(func)), x0-2*h+i*h-h);

end

hd = 1/h/h;

switch type

case 1

        df = (y(3) - 2*y(4) + y(5))*hd;      %用第1个公式求二阶导数

    case 2

        df = (y(2) - 2*y(3) + y(4))*hd;      %用第2个公式求二阶导数

    case 3

        df = (y(1) - 2*y(2) + y(3))*hd;      %用第3个公式求二阶导数

end

 

 

 

%采用四点公式法求函数func在x0处的二阶导数

function df= FourPoint2(func,x0,type,h)

%函数名: func

%求导点: x0

%四点公式法的形式: type

%步长:h

%导数值: df

if nargin == 3

    h = 0.1;

else if (nargin == 4 && h == 0.0)

        disp(' h不能为0!');

        return;

    end

end

for i=1:7

    y(i) = subs(sym(func), findsym(sym(func)), x0-3*h+i*h-h);

end

hd = 1/6/h/h;

switch type

    case 1

        df = (12*y(4) - 30*y(5) + 24*y(6) - 6*y(7))*hd; %用第1个公式求二阶导数

    case 2

        df = (6*y(3) - 12*y(4) + 6*y(5))*hd; %用第2个公式求二阶导数

    case 3

        df = (12*y(4) - 30*y(3) + 24*y(2) - 6*y(1))*hd; %用第3个公式求二阶导数

end

 

 

 

%采用五点公式法求函数func在x0处的二阶导数

function df= FivePoint2(func,x0,type,h)

%函数名: func

%求导点: x0

%五点公式法的形式: type

%步长:h

%导数值: df

if nargin == 3

    h = 0.1;

else if (nargin == 4 && h == 0.0)

        disp('h不能为0!');

        return;

    end

end

for i=1:9

    y(i) = subs(sym(func), findsym(sym(func)), x0-4*h+i*h-h);

end

hd = 1/12/h/h;

switch type

    case 1

        df = (35*y(5)-104* y(6)+114* y(7)-56* y(8)+11* y(9))*hd; %用第1个公式求二阶导数

    case 2

        df = (11*y(4)-20* y(5)+6* y(6)+4* y(7)- y(8))*hd; %用第1个公式求二阶导数

    case 3

        df = (-y(3)+16* y(4)-30* y(5)+16* y(6)- y(7))*hd; %用第1个公式求二阶导数

    case 4

        df = (-y(2)+4*y(3)-6*y(4)+20*y(5)+11*y(6))*hd; %用第1个公式求二阶导数

    case 5

        df = (35*y(5)-104* y(4)+114* y(3)-56* y(2)+11* y(1))*hd; %用第1个公式求二阶导数

end

 

------3

 

%采用五点公式法求函数func在x0处的二阶导数

function df= FivePoint2(func,x0,type,h)

%函数名: func

%求导点: x0

%五点公式法的形式: type

%步长:h

%导数值: df

if nargin == 3

    h = 0.1;

else if (nargin == 4 && h == 0.0)

        disp('h不能为0!');

        return;

    end

end

for i=1:9

    y(i) = subs(sym(func), findsym(sym(func)), x0-4*h+i*h-h);

end

hd = 1/12/h/h;

switch type

    case 1

        df = (35*y(5)-104* y(6)+114* y(7)-56* y(8)+11* y(9))*hd; %用第1个公式求二阶导数

    case 2

        df = (11*y(4)-20* y(5)+6* y(6)+4* y(7)- y(8))*hd; %用第1个公式求二阶导数

    case 3

        df = (-y(3)+16* y(4)-30* y(5)+16* y(6)- y(7))*hd; %用第1个公式求二阶导数

    case 4

        df = (-y(2)+4*y(3)-6*y(4)+20*y(5)+11*y(6))*hd; %用第1个公式求二阶导数

    case 5

        df = (35*y(5)-104* y(4)+114* y(3)-56* y(2)+11* y(1))*hd; %用第1个公式求二阶导数

end

 

六、实验结果分析

  1.  

在题目一中分别使用了复合梯形公式、复合抛物线公式、以及龙贝格公式对两个题目的积分进行了求解。就结果而言,通过实验结果中的各项数据对比可以明显看出:准确度为 ----龙贝格公式>复合抛物线公式>复合梯形公式;其中龙贝格公式近乎接近正确值,精度达到了极高的标准,相比较之下,复合梯度公式的精度就比较低了。故而,在不考虑计算的时间和空间效率时,使用龙贝格公式的精度最高,效果最好;如果加上时间空间来考虑,可以采用复合抛物线公式来求解。

 

    2. 

在题目二中分别使用了三点公式、四点公式、以及五点公式对两个题目的函数进行了求导,在题目三种采用了五点公式,在不同的步长设定下进行了求导。就结果而言,通过实验结果中的各项数据对比的表格可以明显看出: ·在相同的步长下,求解精度:五点公式>四点公式>三点公式;  ·在同一公式下,步长越长,求解的精度会越高;  ·在步长较低(h=0.1)时,三点公式所求得的导数值摆动较大,几乎无法使用; ·在取步长较高(h=0.001)时,采用五点公式,精度极高,几乎可以替代精确值使用。

 

 

---------------------------------------------------

排版依旧很别扭,截图更方便阅读,怎么说呢、、、、、凑合还能看吧

 

posted @ 2017-04-10 18:44  nanashi  阅读(2779)  评论(0编辑  收藏  举报