首页 > 代码库 > 数值计算实验报告---复合求积公式(梯形、抛物线、龙贝格)、导数求值(三点、四点、五点公式)
数值计算实验报告---复合求积公式(梯形、抛物线、龙贝格)、导数求值(三点、四点、五点公式)
----------------------个人作业,如果有后辈的作业习题一致,可以参考学习,一起交流,请勿直接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
六、实验结果分析
在题目一中分别使用了复合梯形公式、复合抛物线公式、以及龙贝格公式对两个题目的积分进行了求解。就结果而言,通过实验结果中的各项数据对比可以明显看出:准确度为 ----龙贝格公式>复合抛物线公式>复合梯形公式;其中龙贝格公式近乎接近正确值,精度达到了极高的标准,相比较之下,复合梯度公式的精度就比较低了。故而,在不考虑计算的时间和空间效率时,使用龙贝格公式的精度最高,效果最好;如果加上时间空间来考虑,可以采用复合抛物线公式来求解。
2.
在题目二中分别使用了三点公式、四点公式、以及五点公式对两个题目的函数进行了求导,在题目三种采用了五点公式,在不同的步长设定下进行了求导。就结果而言,通过实验结果中的各项数据对比的表格可以明显看出: ·在相同的步长下,求解精度:五点公式>四点公式>三点公式; ·在同一公式下,步长越长,求解的精度会越高; ·在步长较低(h=0.1)时,三点公式所求得的导数值摆动较大,几乎无法使用; ·在取步长较高(h=0.001)时,采用五点公式,精度极高,几乎可以替代精确值使用。
---------------------------------------------------
排版依旧很别扭,截图更方便阅读,怎么说呢、、、、、凑合还能看吧
数值计算实验报告---复合求积公式(梯形、抛物线、龙贝格)、导数求值(三点、四点、五点公式)