+ -
当前位置:首页 → 问答吧 → 计算行列式

计算行列式

时间:2006-12-28

来源:互联网

根据公式D = ∑ A(i)(1)×(i,1)元的余子式×(-1)^(i+j)                      (i,j取值0~n)
复制PHP内容到剪贴板
PHP代码:

<?php
function fetch_left_array($array,$n,$line){//取得余子式函数
    for($i=0;$i< ($n-1);$i++)
        for($j=0,$k=0;$j<$n;$j++){
            if($j==$line){
                continue;
            }
            $push_array[$i][$k] = $array[$i+1][$j];
            $k++;
        }
    return $push_array;
}
function com_each_array($array,$n){//递归算出余子式的值,给出的行列式本身其实也可以算是余子式
    if($n>3){
        for($line=0;$line<$n;$line++){
            if($line%2){
                if($array[0][$line]==0){
                    $result -= 0;
                }else{
                    $result -= $array[0][$line]*com_each_array(fetch_left_array($array,$n,$line),$n-1);
                }
            }else{
                if($array[0][$line]==0){
                    $result += 0;
                }else{
                    $result += $array[0][$line]*com_each_array(fetch_left_array($array,$n,$line),$n-1);
                }
            }
        }
    }elseif($n==3){
        $result = $array[0][0]*$array[1][1]*$array[2][2]+$array[0][1]*$array[1][2]*$array[2][0]+$array[0][2]*$array[1][0]*$array[2][1]-($array[0][2]*$array[1][1]*$array[2][0]+$array[0][0]*$array[1][2]*$array[2][1]+$array[0][1]*$array[1][0]*$array[2][2]);
    }elseif($n==2){
        $result = $array[0][0]*$array[1][1]-$array[0][1]*$array[1][0];
    }elseif($n==1){
        $result = $array[0][0];
    }
    return $result;
}

/*
$n           = 4;
$array[0][0] = 0; $array[0][1] = 2; $array[0][2] = 3; $array[0][3] = 4;
$array[1][0] = 5; $array[1][1] = 6; $array[1][2] = 7; $array[1][3] = 8;
$array[2][0] = 9; $array[2][1] = 10;$array[2][2] = 10;$array[2][3] = 12;
$array[3][0] = 13;$array[3][1] = 14;$array[3][2] = 15;$array[3][3] = 16;
echo com_each_array($array,$n);
*/
if($_POST['rows_cols']){
    $n = $_POST['rows_cols'];
    if($n>=10&&$n<=35){
        echo "<center>计算大于等于10阶的行列式较慢</center>";
    }elseif($n > 35){
        echo "<center>难道你跟电脑过不去,还是在考验PHP?</center>";
        exit;
    }
    echo "<center><form action={$_SERVER['PHP_SELF']} method=\"post\">";
    for($i=0;$i < $n;$i++){
        for($j=0;$j < $n;$j++){
            echo "<input name=\"determinant[]\" size=\"2\" value=0>";
        }
        echo "<br>";
    }
    echo "<input type=\"hidden\" name=\"rank\" value=\"{$n}\"><input type=\"submit\" name=\"calculation\" value=\"计算\"></form></center>";
} elseif($_POST['calculation']) {
    set_time_limit(0);
    $begin = explode(' ', microtime());
    $i=0;
    $j=0;
    $postarray = $_POST['determinant'];
    foreach($postarray as $value){
        $array[$i][$j] = $value;
        if($j+1==$_POST['rank']) {
            $i++;
            $j = 0;
        }else{
            $j++;
        }
    }
    $rs = com_each_array($array,$_POST['rank']);
    echo "<center><font color=red size=5>".$rs."</font></center>";
    $end = explode(' ', microtime());
    $time = ($end[0]+$end[1]) - ($begin[0]+$begin[1]);
    echo '<br>';
    echo "执行时间:{$time}秒";
} else {
    echo "<center>计算";
    echo "<form action={$_SERVER['PHP_SELF']} method=\"post\"><input name=\"rows_cols\" value=1><input type=\"submit\" value=\"设 定\"></form>";
    echo "阶行列式</center>";
}
?>

[ 本帖最后由 muqiao 于 2006-12-28 04:20 编辑 ]

作者: muqiao   发布时间: 2006-12-27

好,收藏!
:) :)

作者: jefsun   发布时间: 2006-12-28

复制PHP内容到剪贴板
PHP代码:
/*按行张开行列式
参数说明:
            $array 送进的行列式
            $n 送进的行列式阶数
            $line 取得$array第一行,第$line列得余子式
*/
function fetch_left_array($array,$n,$line){//取得余子式函数,
    for($i=0;$i< ($n-1);$i++)
        for($j=0,$k=0;$j<$n;$j++){
            if($j==$line){
                continue;
            }
            $push_array[$i][$k] = $array[$i+1][$j];
            $k++;
        }
    return $push_array;
}
function com_each_array($array,$n){//递归算出余子式的值,给出的行列式本身其实也可以算是余子式
    if($n>3){
        for($line=0;$line<$n;$line++){
            if($line%2){ //(-1)^($line)=-1时就减
                if($array[0][$line]==0){//如果元$array[0][$line]=0,直接跳过计算后面余子式,加快运算速度
                    $result -= 0;
                }else{
                    $result -= $array[0][$line]*com_each_array(fetch_left_array($array,$n,$line),$n-1);
                }
            }else{ //(-1)^($line)=+1时就加
                if($array[0][$line]==0){//如果元$array[0][$line]=0,直接跳过计算后面余子式,加快运算速度
                    $result += 0;
                }else{
                    $result += $array[0][$line]*com_each_array(fetch_left_array($array,$n,$line),$n-1);
                }
            }
        }
    }elseif($n==3){//3阶行列式得计算
        $result = $array[0][0]*$array[1][1]*$array[2][2]+$array[0][1]*$array[1][2]*$array[2][0]+$array[0][2]*$array[1][0]*$array[2][1]-($array[0][2]*$array[1][1]*$array[2][0]+$array[0][0]*$array[1][2]*$array[2][1]+$array[0][1]*$array[1][0]*$array[2][2]);
    }elseif($n==2){//2阶行列式得计算
        $result = $array[0][0]*$array[1][1]-$array[0][1]*$array[1][0];
    }elseif($n==1){//1阶行列式得计算
        $result = $array[0][0];
    }
    return $result;
}

作者: muqiao   发布时间: 2006-12-29

汗。。。连公式都没看懂。。

作者: 玉面修罗   发布时间: 2006-12-29

线性代数吗? 行列式计算?唉,早都还给老师了,博主不错,赞~

作者: Verdana   发布时间: 2006-12-31

复制PHP内容到剪贴板
PHP代码:

<?php
function num_sort($array){//计算指定排列逆序数
    $t = 0;
    $length = strlen($array);
    for($j=1;$j < $length;$j++){
        for($i=0;$i<$length-$j;$i++){
            if($array[$i]>$array[$i+1]){
                $temp = $array[$i];
                $array[$i] = $array[$i+1];
                $array[$i+1] = $temp;
                $t++;
            }
        }
    }
    return $t;
}
function gosort($array,$len){//全排列
    if($len<=2){
        $rs_array[0]=$array[0].$array[1];
        $rs_array[1]=$array[1].$array[0];
    }else{
        for($i=0;$i<$len;$i++){
            $leave_one=$array[$i];
            $k=0;
            for($j=0;$j<$len;$j++){
                if($j==$i){
                    continue;
                }else{
                    $tosent[$k]= $array[$j];
                    $k++;
                }
            }
            $fetch = gosort($tosent,$len-1);
            foreach($fetch as $comein){
                $rs_array[] = $leave_one.$comein;
            }
        }
    }
    return $rs_array;
}
function calculate($array,$rank){//计算
    for($k=0;$k < $rank;$k++){
        $tosort[$k]=$k;
    }
    $sort_array = gosort($tosort,$rank);
    foreach($sort_array as $menu){
        $ready=pow(-1,num_sort($menu));
        for($i=0;$i<$rank;$i++){
            $ready *= $array[$i][$menu[$i]];
        }
        $result += $ready;
    }
    return $result;
}
/*
$n           = 4;
$array[0][0] = 1; $array[0][1] = 1; $array[0][2] = 1; $array[0][3] = 1;
$array[1][0] = 1; $array[1][1] = 2; $array[1][2] = 4; $array[1][3] = 8;
$array[2][0] = 1; $array[2][1] = 3; $array[2][2] = 9; $array[2][3] = 27;
$array[3][0] = 1; $array[3][1] = 4; $array[3][2] = 16;$array[3][3] = 64;
echo calculate($array,$n);
*/
if($_POST['rows_cols']){
    $n = $_POST['rows_cols'];
    if($n>=10&&$n<=35){
        echo "<center>计算大于等于10阶的行列式较慢</center>";
    }elseif($n > 35){
        echo "<center>难道你跟电脑过不去,还是在考验PHP?</center>";
        exit;
    }
    echo "<center><form action={$_SERVER['PHP_SELF']} method=\"post\">";
    for($i=0;$i < $n;$i++){
        for($j=0;$j < $n;$j++){
            echo "<input name=\"determinant[]\" size=\"2\" value=0>";
        }
        echo "<br>";
    }
    echo "<input type=\"hidden\" name=\"rank\" value=\"{$n}\"><input type=\"submit\" name=\"calculation\" value=\"计算\"></form></center>";
} elseif($_POST['calculation']) {
    set_time_limit(0);
    $begin = explode(' ', microtime());
    $i=0;
    $j=0;
    $postarray = $_POST['determinant'];
    foreach($postarray as $value){
        $array[$i][$j] = $value;
        if($j+1==$_POST['rank']) {
            $i++;
            $j = 0;
        }else{
            $j++;
        }
    }
    $rs = calculate($array,$_POST['rank']);
    echo "<center><font color=red size=5>".$rs."</font></center>";
    $end = explode(' ', microtime());
    $time = ($end[0]+$end[1]) - ($begin[0]+$begin[1]);
    echo '<br>';
    echo "执行时间:{$time}秒";
} else {
    echo "<center>计算";
    echo "<form action={$_SERVER['PHP_SELF']} method=\"post\"><input name=\"rows_cols\" value=1><input type=\"submit\" value=\"设 定\"></form>";
    echo "阶行列式</center>";
}
?>

作者: muqiao   发布时间: 2007-01-02

虽看不懂......但强烈支持!

作者: 86800787   发布时间: 2007-01-03

不错。收藏了。

作者: jefsun   发布时间: 2007-01-03