理工科应该都学线性代数吧,增广矩阵大家还是知道的 ------------------ 原始邮件 ------------------ 发件人: "wd"<[email protected]>; 发送时间: 2011年7月15日(星期五) 上午10:27 收件人: "perlchina"<[email protected]>;
主题: Re: [PerlChina] Re: 请问哪位用perl写过解方程组的脚本? 你这纯数学问题,太专业了 知道什么是增广矩阵的都没几个,你指望大家能怎么帮你 在 2011年7月13日 下午5:32,Hydraphenix <[email protected]> 写道: > 没有人回答我的问题,只好自己参照网上python的程序写了个gauss-jordan消元的程序,将增广矩阵作消元后,得到简化行梯矩阵,参数是增 > 广矩阵的reference。 > 好像这个组里能真正帮上忙的不多... > > sub gauss_jordan > { > print "gauss_jordan elimination!\n"; > my $m = &matrix_row($_[0]); print "there are $m rows in the > matrix!\n"; > my $n = &matrix_column($_[0]); print "there are $n columns in > the matrix!\n"; > my $k = $m; > $k=$n, if($k>$n); > > for(my $i=0;$i<$k;$i++) #转换成上三角矩阵 > { > my $maxrow = $i; > for(my $j=($i + 1) ;$j<$m;$j++) > { > if(abs($_[0]->[$j][$i]) > abs($_[0]->[$maxrow][$i])) > { > $maxrow = $j; > } > } > my @temp; > @temp = @{$_[0]->[$i]}; > @{$_[0]->[$i]} = @{$_[0]->[$maxrow]}; > @{$_[0]->[$maxrow]} = @temp; > #换行成功!接下来将该列的余下的元素全部消为0 > if(abs($_[0]->[$i][$i]) > 0 ) > { > for(my $j=($i + 1) ;$j<$m;$j++) > { > my $c = $_[0]->[$j][$i]/$_[0]->[$i][$i]; > for(my $x =$i;$x<$n;$x++) > { > $_[0]->[$j][$x] -= $_[0]->[$i][$x]*$c; > } > } > } > else > { > print "find a o column!\n"; > } > } ##成功转换成上三角矩阵 > &output_matrix($_[0]); > print "\n"; > ##下面将上三角矩阵尽量简化,反向将非对角线元素消为0 > for(my $i=$k-1;$i>=0;$i--) > { > if(abs($_[0]->[$i][$i])>0) > { > my $c = $_[0]->[$i][$i]; > for(my $j=0; $j<$i;$j++) > { > for(my $x=$n-1;$x>=$i;$x--) > { > $_[0]->[$j][$x] -= $_[0]->[$i][$x]*$_[0]- >>[$j][$i]/$c; > } > } > ##以上已经将上三角非对角线元素消为0 > ##以下将对角线元素消为1 > for(my $x=$i;$x<$n;$x++) > { > $_[0]->[$i][$x] /=$c; > } > } > else > { > print "the diagonal element is 0!\n"; > } > } > &output_matrix($_[0]); > return($_[0]); > } > > # &matrix_row($m) > sub matrix_row > { my $array = $_[0]; > my $k=0; > foreach (@{$array}) > { > $k++; > # print "$_!\n"; > } > return($k); > } > > # &matrix_column($m) > sub matrix_column > { > my $array = $_[0]; > my $k=0; > foreach (@{$array->[0]}) > { > $k++; > # print "$_!\n"; > } > return($k); > } > > sub output_matrix > { > my $m = &matrix_row($_[0]); # print "there are $m rows in the > matrix!\n"; > my $n = &matrix_column($_[0]); # print "there are $n columns in > the matrix!\n"; > for(my $i=0;$i<$m;$i++) #转换成上三角矩阵 > { > my $line = join("\t",@{$_[0]->[$i]}); > print "$line\n"; > } > } > > > > > > > > On 7月5日, 下午4时20分, Hydraphenix <[email protected]> wrote: >> 要做一些数据的计算,使用math-assistant中的Solve_Det函数,要求系数矩阵必须是正方形矩阵。我的数据中不能保证是正方形矩阵。 >> 但计算前可以判断矩阵的秩与未知数的个数相等。在网上搜索了半天,都没有好的思路,希望有朋友能指点下。 > > -- > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。 > 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 > 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。 > 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。 > > -- 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。 -- 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
