您当前的位置: 首页  实验教学  实验与实践  实验一:递推计算的稳定性

实验一算法的数值稳定性实验

  

% P1 1 求积分

%                       I(n) = exp(-1)*int( x^n*exp(x),0,1 )

  

function try_stable

global n          % 定义全局变量 n ,见后自定义函数 f 中的参量            

N = 20;           % 计算 N 个值

  

%--------------------------------------------

% [算法1] 用递推公式

%                        I(k) = 1 - k*I(k-1)

% 取初值                 I0=1-exp(-1)  (约有15位有效数字)     

% [] 如果取 I0 = 0.6321,结果同书 P2 1-1,这里初值更精确

  

I0 = 1-exp(-1);          % 初值

I = zeros(N,1);          % 创建 N x 1 矩阵(即列向量),元素全为零

I(1) = 1-I0;

for k = 2:N

    I(k) = 1 - k*I(k-1);

end

%--------------------------------------------

% [算法2] 用递推公式

%                        I(k-1) = ( 1 - I(k) ) / k

% 取初值                 II(N) = 0 (参见 P5 3)

  

II = zeros(N,1);

II(N) = 0;

for k = N:-1:2

    II(k-1) = ( 1 - II(k) ) / k;

end

%--------------------------------------------

%  调用 matlab 高精度数值积分命令 quadl 计算以便比较

%  [] 该命令以后学习,你现在可模仿使用

  

III = zeros(N,1);

e_1 = exp(-1);

for k = 1:N

    n = k;                            % 给函数 f 中的参量 n 赋值

    III(k) = e_1 * quadl(@f,0,1);     % 求函数 f [0,1]上的定积分

end

%--------------------------------------------

% 显示计算结果

clc   % 清命令窗

fprintf('\n               算法1结果           算法2结果            精确值')

for k = 1:N,

    fprintf('\nI(%2.0f)  %17.7f   %17.7f   %17.7f',k,I(k),II(k),III(k))

end

% []  这里所谓的精确值是指计算显示的数字全是有效数字

%--------------------------------------------

function y = f(x)         % 定义函数

global n                  % 参量 n 为全局变量

y = x.^n.*exp(x);         % ★注意:这里一定要 '' 运算

return

%--------------------------------------------

  

  

% ********   思考题   ********

% 通过上述结果,说明了什么?

% 是不是公式是对的,程序是对的,计算的结果一定是可靠的?

% 造成这种现象的原因是什么? 如何从理论上加以分析?

  

% ********  你的实验  ********

  

% 【实验一】  二次方程求根( P8 6 )

% 编写二次方程求根的数值稳定的算法

  

% ★【实验二】  P11 实验课题()

% [说明] 你可模仿该程序来做实验,你只要把下面程序复制为新的 M-文件,

%        去掉开头的 % (参见菜单Text中的 Ctrl_T Ctrl_R命令)

%        再把 '?' 部分改写正确就是一个完整的程序

  

  

% myexp1_1.m --- 算法的数值稳定性实验

% P11 实验课题()

%

% function try_stable

% global n a

% N = 20;                  % 计算 N 个值

% a = ?;

% %--------------------------------------------

% % [方案I] 用递推公式

% %         I(k) =  - a*I(k-1) + 1/k

%

% I0 = ?;                  % 初值

% I = zeros(N,1);          % 创建 N x 1 矩阵(即列向量),元素全为零

% I(1) = ?;

% for k = 2:N

%     I(k) = ?;

% end

% %--------------------------------------------

% % [方案II] 用递推公式

% %          I(k-1) = ( - I(k) + 1/k ) / a

%

% II = zeros(N,1);

% if a >= N/(N+1)

%     II(N) = ?;

% else

%     II(N) = ?;

% end

% for k = N:-1:2

%     II(k-1) =  ?;

% end

% %--------------------------------------------

% %  调用 matlab 高精度数值积分命令 quadl 计算以便比较

%

% III = zeros(N,1);

% for k = 1:N

%     n = k;

%     III(k) = quadl(@f,0,1);

% end

% %--------------------------------------------

% % 显示计算结果

%

% clc

% fprintf('\n               方案I结果           方案II结果            精确值')

% for k = 1:N,

%     fprintf('\nI(%2.0f)  %17.7f   %17.7f   %17.7f',k,I(k),II(k),III(k))

% end

% %--------------------------------------------

% function y = f(x)         % 定义函数

% global n a                % 参量 n 为全局变量

% y = ?;                    % ★注意:这里一定要 '' 运算

% return

% %--------------------------------------------