一、题目要求
二、注意点
因为matlab是从下标1开始,而其他的编程语言都是从0开始,所以就算是这个题目中求的是E0,实际上应该在E列向量中存的是E(1),这个是向量元素的起始下标;所以定义的时候定义E=zeros(N+1,1)因为从0到N一共是N+1个数,然后for循环中的循环变量n从1开始一直到N+1,也是为了和向量元素下标从1开始相匹配;这里面比较绕的一点就是数学的递推公式是从0开始,而matlab列向量存储元素的下标是从1开始。
三、.m代码表示
N=9;
x=0:N;
%定义一个N+1行1列的列向量,元素全是0,存储值
E1=zeros(N+1,1);
E2=zeros(N+1,1);
for n=1:N+1
%真实的值,定积分语法
f=@(x)(power(x,n)).*exp(x-1);
r=integral(f,0,1);
%算法1
if n==1
E1(n)=(double(vpa(1-1/exp(1),4))-r)/r;
else
E1(n)=(double(vpa(1-n*E1(n-1),4))-r)/r;
end
%算法2
if n==N+1
E2(n)=0;
else
E2(n)=double(vpa((1-E2(n+1))/n,4)-r)/r;
end
end
figure
%绘制两条曲线 E1用blue蓝色表示,E2用red红色表示
plot(x, E1, 'b', x, E2, 'r');
title('相对误差(精确度)')
%绘制图标E1是算法1
legend('算法1', '算法2');
xlabel('n');
ylabel('E(n)');
四、效果图
因此算法2的精确度更高