矩阵与数值分析
学 院 专 业 班 级 学 号 姓 名
电子信息与电气工程学部
生物医学工程
刘江涛
1:考虑计算给定向量的范数;输入向量x?(x1,x2,?,xn)T,输出x1,x2,x?,请编制一个通用程序,并用你编制的程序计算如下向量的范数:
1??11Tx??1,,,?,?,y??1,2,?,n?
n??23对n?10,100,1000甚至更大的n计算其范数,你会发现什么结果?你能否修改你的程序使得计算结果相对精确呢?
通用求范数程序: function NORM(x) y1=sum(abs(x)); y2=(sum(x.^2))^(1/2); y3=max(abs(x));
fprintf('1-范数=%g; 2-范数= %g; inf-范数=%g\\n',y1,y2,y3); 例题的运行程序: function xianglaing(n) x=[]; y=[]; for i=1:n x(i)=1/i; y(i)=i; end
disp('x 的范数:'); NORM(x'); disp(' ')
disp('y 的范数:'); NORM(y'); 运行结果如下表:
T n 范数 10 100 1000 x1 2.92897 5.18738 7.48547 x2 x? 1 1 1 1.2449 1.27866 1.28216 n 范数 10 100 1000 y1 55 5050 500500 y2 y? 10 100 1000 19.6214 581.679 18271.1 根据上述的两个表的运行结果,我们可以得知无论n的值如何变化,对于x??1恒成立;y??n恒成立,其1-范数与2-范数随着n的增大而增大,但是其变化越来越小,这是因为计算在进行数值计算时有误差存在,对于表达式(1)当n很大时
1却很n小,会出现“大数吃小数的现象”;修改方案:当n很大时我们避免用n做除数,因为当n非常大时
1?0成立;所以在求解其范数时我们从小数开始相加,无穷个非常n小的数值相加也可能是个很大的数,从而可以避免两个数相加时出现“大数吃小数”的现象;
2:考虑y?f(x)?ln(1?x),其中定义f(0)?1,此时f(x)是连续函数,用此公x式计算当x?[?10?15,10?15]时的函数值,画出图像。另一方面,考虑下面算法:
d?1?x;ifd?1theny?1elsey?lnd/(d?1)endif
用此算法计算x?[?10?15,10?15]时的函数值,画出图像,比较一下发生了什么? 程序:
x=-10^(-15):10^(-20):10^(-15);
if (x==0) f=1; else f=log(1+x)/x; end figure(1) plot(x,f); d=1+x; if d==1 y=1; else
y=log(d)/(d-1); end figure(2) Plot(x,y);
有图可知,直接用公式f(x)?ln(1?x)计算x?[?10?15,10?15]的函数值时,除了在xx?0出的值为1,其他的值都是无限趋近于1;而利用算法二算出的结果全为1;出
现这这情况的原因是x的取值非常接近于0,在用公式d?1?x求d得过程中出现了大数吃小数的情况,所以在用计算机计算时d?1恒成立,从而使y?1恒成立;
3: 首先编写一个利用秦九韶算法计算一个多项式在定点的函数值的通用程序,你的程序包括输入多项式的系数以及定点,输出函数值,利用你编写的程序计算
f(x)?(x?2)9?x9?18x8?144x7?672x6?2016x5?4032x4?5376x3?4608x2?2304x?512在x?2邻域附近的值,画出p(x)在x?[1.95,20.5]上地图像。
秦九韶算法的通用程序:
%A为多项式的以升幂排列的系数,x为初始值 function p=qinjiushao(A,x) a=A; [~,n]=size(a); n=n-1; S=[];
S(n+1)=a(n+1); for k=n:-1:1
S(k)=x.*S(k+1)+a(k);