选主元消元法求矩阵的逆-程序示例

7 views
Skip to first unread message

XuQiang

unread,
Dec 14, 2009, 9:16:19 PM12/14/09
to 数值计算讨论组
今天上机课上,信计2班的王静同学给出了《数值分析引论》P300 习题8的一个Matlab程序,见附件liezhuyuanGJ.m。请同学们参考
一下,并提一些意见。

另外,我们提一个关于此程序的问题。程序中用选主元消元法求解矩阵A的逆矩阵时,是使用每一个对角线A(k,k)元素所在的行去消所有行中的A
(i,k),其中1<= i <=n。请问这种消元法有什么优点和缺点?

可以给出一些想法的同学请直接回复并留下你的学号和姓名,这会和平时成绩相关。

friend726

unread,
Dec 15, 2009, 3:30:45 AM12/15/09
to numericaltest
斗胆在这说一下自己的想法吧。
   首先,王静写的matlab程序,非常棒。巧妙的标记变量设置,程序层次清楚,注释恰当。非常欣赏。
   二。提一下建议。
     (1)最好将此程序设为函数,可使此程序的重用性提高。
             例如:function [inv]  inverse(input);
                   inv = zeros(size(input));
                   inv = C(1:n,n+1:2*n);
       (2)下面语句中:我建议将“1”改为“k”。我认为会减少一些运算量。
             %将C的C(k,k)应用行变换变为1
                        ckk = C(k,k);
                   for j = 1:2*n
                C(k,j) = C(k,j)/ckk;
                            end
          %将C第k列除C(k,k)应用行变换全变为0
        (3)程序中最后一句,我认为改为 C(1:n,n+1:2*n)比较好。
          其实我的方法,就是将原程序,转为函数,提高重用性。
 三。至于xuqiang老师的问题。我认为举个例子最好说明问题。
     例如:
     (0.000000000000000000333333333333333,2;10,4)
 10除于很小的数,误差是很大的。(或者很小的数做分母误差就会很大了。)
优点:选注元方法,就会很好的避面A(k,k)很小的情况,使数值精确和稳定性更好。
至于缺点,就是运算量更多一些。(多了n(n-1)/2步比较和至多n-1次行交换。我算的是这个。)
 
其实我在此说的都是多余的,xuqiang老师的问题,数值老师有讲。而我的对于程序的改进,只要作者想变为函数,自然就会解决。
所以,My name is nobody.

Nobody

unread,
Dec 15, 2009, 3:35:54 AM12/15/09
to 数值计算讨论组
补充一下,之所以高等代数没有选主元,而数值有选,主要是高代是理想的处理,而计算机确无法存储趋于无穷的小数或者无穷大的数。

> 在2009-12-15,XuQiang <xuqiang...@gmail.com> 写道:
>
>
>
> >今天上机课上,信计2班的王静同学给出了《数值分析引论》P300 习题8的一个Matlab程序,见附件liezhuyuanGJ.m。请同学们参考
> >一下,并提一些意见。
>
> >另外,我们提一个关于此程序的问题。程序中用选主元消元法求解矩阵A的逆矩阵时,是使用每一个对角线A(k,k)元素所在的行去消所有行中的A
> >(i,k),其中1<= i <=n。请问这种消元法有什么优点和缺点?
>

> >可以给出一些想法的同学请直接回复并留下你的学号和姓名,这会和平时成绩相关。- 隐藏被引用文字 -
>
> - 显示引用的文字 -

XuQiang

unread,
Dec 15, 2009, 11:43:34 PM12/15/09
to 数值计算讨论组
我比较喜欢有层次感和大量注释的程序,我想大多数人都会有这种感觉,如果没有商业化的因素在其中,多写一些注释是必不可少的一件事情。所以建议大家都在
自己的程序中写写注释,不但是给别人看,也是给自己看的。

选主元和变程序为函数的事情nobody说的很清楚了。

关于(2)下面语句中:我建议将“1”改为“k”。我认为会减少一些运算量。


%将C的C(k,k)应用行变换变为1
ckk = C(k,k);
for j = 1:2*n
C(k,j) = C(k,j)/ckk;
end
%将C第k列除C(k,k)应用行变换全变为0

我没有看明白是什么意思,这个消元求逆矩阵的过程是需要行变换为单位阵的,不知Nobody的理解是否有失偏颇。

最后,U r not nobody, u will be somebody someday.

friend726

unread,
Dec 16, 2009, 2:20:39 AM12/16/09
to numericaltest
至于老师提出的问题,我想举个例子吧。
例如:
A = [1, 2, 3;  1, 4, 2 ;1, 3, 5;] (只是举个例子,是不是非奇异矩阵暂且不管吧,只是说一下过程)
约化第一列会将A约化为 A = [1, 2, 3; 0, 2, -1; 0, 1, 3;]
约化第二列时,要将第二行单位化,但是A(2,1)是 0 呀!,根本不需要单位化的。而程序中j是从1开始的。如果改为k,就会避免0的单位化,减少一些运算。我想虽然是0,但是Computer还是要运算一次的吧。
   谢谢老师的回复。有不当之处还望不吝指教。

XuQiang

unread,
Jan 6, 2010, 8:17:34 AM1/6/10
to 数值计算讨论组
为了节省计算量,是这样,没错。
Reply all
Reply to author
Forward
0 new messages