请问哪位用perl写过解方程组的脚本?

35 views
Skip to first unread message

Hydraphenix

unread,
Jul 5, 2011, 4:20:19 AM7/5/11
to PerlChina Mongers 讨论组
要做一些数据的计算,使用math-assistant中的Solve_Det函数,要求系数矩阵必须是正方形矩阵。我的数据中不能保证是正方形矩阵。
但计算前可以判断矩阵的秩与未知数的个数相等。在网上搜索了半天,都没有好的思路,希望有朋友能指点下。

Michael Zeng

unread,
Jul 5, 2011, 4:56:08 AM7/5/11
to perl...@googlegroups.com
use matlab ,

2011/7/5 Hydraphenix <hydrap...@gmail.com>
要做一些数据的计算,使用math-assistant中的Solve_Det函数,要求系数矩阵必须是正方形矩阵。我的数据中不能保证是正方形矩阵。
但计算前可以判断矩阵的秩与未知数的个数相等。在网上搜索了半天,都没有好的思路,希望有朋友能指点下。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perl...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。




--
            Yours Sincerely
                    Zeng Hong

Robin Lee

unread,
Jul 5, 2011, 4:57:23 AM7/5/11
to perl...@googlegroups.com
试看看 PDL

2011/7/5 Hydraphenix <hydrap...@gmail.com>:


> 要做一些数据的计算,使用math-assistant中的Solve_Det函数,要求系数矩阵必须是正方形矩阵。我的数据中不能保证是正方形矩阵。
> 但计算前可以判断矩阵的秩与未知数的个数相等。在网上搜索了半天,都没有好的思路,希望有朋友能指点下。
>

Hydraphenix

unread,
Jul 5, 2011, 5:00:46 AM7/5/11
to PerlChina Mongers 讨论组
能更详细点吗,你是指math::matlab这个包吗?

On 7月5日, 下午4时56分, Michael Zeng <galaxy2...@gmail.com> wrote:
> use matlab ,
>

> 2011/7/5 Hydraphenix <hydrapheni...@gmail.com>

Hydraphenix

unread,
Jul 5, 2011, 5:03:50 AM7/5/11
to PerlChina Mongers 讨论组
pdl中的包也不是很熟悉,不知道解方程组的是用什么函数。
能指点详细点吗?

On 7月5日, 下午4时57分, Robin Lee <robinlee.s...@gmail.com> wrote:
> 试看看 PDL
>
> 2011/7/5 Hydraphenix <hydrapheni...@gmail.com>:

Robin Lee

unread,
Jul 5, 2011, 5:10:23 AM7/5/11
to perl...@googlegroups.com
我只是知道这个名字,呵呵

2011/7/5 Hydraphenix <hydrap...@gmail.com>:

Hydraphenix

unread,
Jul 5, 2011, 5:20:01 AM7/5/11
to PerlChina Mongers 讨论组
还是很感谢你。pdl看起来很复杂啊,不晓得什么时候可以找到,哈哈。

On 7月5日, 下午5时10分, Robin Lee <robinlee.s...@gmail.com> wrote:
> 我只是知道这个名字,呵呵
>
> 2011/7/5 Hydraphenix <hydrapheni...@gmail.com>:

Hydraphenix

unread,
Jul 13, 2011, 5:32:52 AM7/13/11
to PerlChina Mongers 讨论组
没有人回答我的问题,只好自己参照网上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";

wd

unread,
Jul 14, 2011, 10:27:48 PM7/14/11
to perl...@googlegroups.com
你这纯数学问题,太专业了
知道什么是增广矩阵的都没几个,你指望大家能怎么帮你

Reply all
Reply to author
Forward
0 new messages