亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        行列式兩種求值算法的比較

        2014-03-05 18:04:14衛(wèi)洪春
        現(xiàn)代電子技術 2014年4期

        摘 要: 為了實現(xiàn)科技和工程技術領域中對有限元線性方程組的快速求解,首先需判斷該線性方程組所對應的行列式的值是否為零。若該值不為零,則線性方程組有惟一確定的解;否則,線性方程組的解不惟一。利用行列式的基本性質、代數(shù)余子式、定理,采用遞歸程序設計方法,設計了兩種算法,用以求解行列式的值;并從運算精度和運行效率上比較了這兩種算法,得出了這兩種算法各自的適用環(huán)境。

        關鍵詞: 遞歸程序設計方法; 行列式算法; 運行效率; 線性方程

        中圖分類號: TN911?34 文獻標識碼: A 文章編號: 1004?373X(2014)04?0025?03

        Comparison between two determinant evaluation algorithms

        WEI Hong?chun

        (Department of Computer Science, Sichuan University of Arts and Science, Dazhou 635000, China)

        Abstract: In order to quickly solve the value offinite element linear equations in the fields of science, technology and engineering, The first step is to judge that the determinants value corresponding to the given linear equations is zero or not. If the value is nonzero, linear equations have only one determinate solution. Otherwise, the answer is not determinate. Two algorithms were designed by using determinant's basic nature, algebraic complement, relevant theorem and recursive programming methods to solve the determinant's value. The two algorithms were compared in calculative accuracy and operational efficiency. The application environment of each algorithm was achieved.

        Keywords: recursive programming method; determinant algorithm; operating efficiency; linear equation

        線性代數(shù)是研究有限維線性空間及其線性變換的基本理論,在科學技術及工程技術領域中應用十分廣泛。例如,運籌學中的線性規(guī)劃;設計集成電路時,對數(shù)百萬電子元件的仿真;機械工程領域復雜線性方程組的數(shù)值求解;工程測量領域中的測量平差等等。其實質是求解n元一次線性方程組。

        對于n元一次線性方程組An×nXn×1=Bn×1,若n階方陣A滿秩時,則有X=A-1B。因此,必須首先求解方陣A所對應的行列式。若該值非零,則A存在可逆矩陣A-1,此方程組有惟一解;否則方陣A是奇異的,方程組的解不惟一。本文探討了對n階行列式求值的兩種算法,并對這兩種算法進行了比較。

        1 基本理論

        對于n階行列式A,有:

        性質1 互換行列式的兩行(列),行列式變號。

        性質2 把行列式的某一列(行)的各元素乘以同一數(shù)后,加到另一列(行)對應的元素上去,行列式不變。

        代數(shù)余子式: 在n階行列式A中,把元素aij所在的第i行和第j列劃去后(見圖1),剩下的n-1階行列式叫做元素aij的余子式,記作Mij,記:

        [Aij=(-1)i+jMij, i=1,2,…,n;j=1,2,…,n]

        式中:Aij是元素aij的代數(shù)余子式。

        定理1 行列式A的值d等于它的任一行(列)的各元素與其對應的代數(shù)余子式乘積之和,即:

        [d=j=1naijAij, j=1,2,…,n或d=i=1naijAij, i=1,2,…,n]

        2 算法分析與設計

        行列式的應用十分廣泛,研究行列式的求值算法非常多[1?3]。在一些特殊領域,會產(chǎn)生一些特殊的行列式,如三次樣條插值過程中產(chǎn)生的三對角陣,可采用追趕法求解。但對于普通的行列式,利用行列式的性質求解是合理的選擇。下面分析并實現(xiàn)了行列式求值的兩種算法,用以求解行列式。

        圖1 代數(shù)余子式

        2.1 代數(shù)余子式

        根據(jù)定理1所述的代數(shù)余子式法,可計算任意n階行列式的值。為此,可選擇最后一行元素,利用代數(shù)余子式計算行列式的值。

        分析[d=j=1naijAij (j=1,2,…,n)]可知,該式具有遞歸函數(shù)的特點,因此可設計遞歸函數(shù)計算行列式A。為方便分析,采用動態(tài)分配的二維數(shù)組double **p來計算。p表示待計算的行列式,n表示行列式p的階。

        算法1:

        double GetValue(double **p,int n){

        若階數(shù)n=1,返回p[0][0]

        double sum = 0; //累加最后一行各元素與其對應的代數(shù)余

        子式的乘積之和的變量

        for(int j = 0 ; j < n ; j++){//累加最后一行各元素與其對應代數(shù)余子式的乘積

        動態(tài)生成n行n列的臨時數(shù)組double **p1,用以保存p 中的元素

        將n階行列式p的各元素保存在n階行列式p1的對應元素中

        保存元素p1[n-1][j]的腳標之和至變量pt

        保存元素p1[n-1][j]至變量ptd

        將ptd所在列右側的各列元素依次向左移動一列。

        動態(tài)生成(n-1)階行列式double **tem

        將行列式p1左上角的(n-1)階行列式轉存至tem

        釋放數(shù)組p1

        sum += ptd * pow(-1,pt) * GetValue(tem,n-1);

        //累加p[n-1][j]與其代數(shù)余子式之積

        釋放數(shù)組tem

        }

        返回該行列式的值sum

        }

        采用代數(shù)余子式計算行列式,思路清晰,計算簡單,是計算低階行列式的有效方法。

        2.2 行列式的基本性質

        根據(jù)第2.1節(jié)的代數(shù)余子式法,若能利用行列式的性質1、性質2將n階行列式A(見圖2)化簡為最后一列元素中除ann≠0(若存在),而該列其余元素均為零的形式(見圖3),則可大大減少計算量。此時行列式的值是ann*A(n-1)(n-1),此式仍具有遞歸函數(shù)的特點。算法設計如算法2所述。

        圖2 n階行列式

        圖3 變換后的第n列

        算法2:

        double GetLineTran(double **p,int n){

        若階數(shù)n=1,返回p[0][0]

        double result = 1.0; //記錄行列式中行交換的次數(shù),每交換

        一次result = result*(-1)

        bool flag = false

        //設置行列式最右邊列中是否存在某個元素不為0

        for(i = 0; i < n; i++){//i表示行號

        若第i行最右邊的元素不等于0,則{

        flag = true;

        若i不是最后一行n-1,則{

        交換第i行與第n-1行對應的所有元素 進行一次行變換: result *= -1.0;

        }

        break;

        }

        }

        if(!flag) return 0; //行列式最右側列的所有元素全為0,則行列式的值為0

        for(i = 0; i < n-1; i++){ // i表示行號,用p[n-1][n-1]將

        P[i][n?1]按規(guī)則變換為0(i從0到n-2)

        若行列式p[i][n-1]≠0,則{

        計算用p[n-1][n-1]將p[i][n-1]變?yōu)?的比例因子t=p[i][n-1]/p[n-1][n-1]

        將第n-1行的各個元素乘以-t,加到第i行的對應元素上(注:行列式的值不變,此時行列式具有圖3的形式)。

        }

        }

        return result * p[n-1][n-1] * GetLineTran(p,n-1);//返加行列式的值

        }

        以上兩種算法均采用遞歸思想完成計算[4?6]。對于算法2,可以非常方便地轉換為非遞歸算法。兩種算法的運算結果如圖4所述。

        圖4 兩種算法的結果

        3 算法比較

        3.1 精度分析

        上述兩種算法均可計算n階行列式的值。算法1中,由于運算過程中只有加減法和乘法運算,除非溢出,否則,計算結果沒有精度損失。算法2中,由于施行了行變換,除了加、減、乘法運算外,還涉及除法運算,因此在計算中有精度損失。

        3.2 效率分析

        算法2在執(zhí)行過程中,由于所有的運算數(shù)據(jù)均在二維數(shù)組p中,不需要額外的空間開銷。對于n階行列式,其遞歸調用的次數(shù)為n,適合計算較高階的行列式。實驗表明,在VC 6.0環(huán)境下,若行列式的元素值在[0,9]間,最高可計算252階的行列式(見圖5)。

        圖5 算法2所示的高階行列式運算結果

        對于算法1,利用代數(shù)余子式完成計算的過程中,需開辟大量的額外空間,并且大量的內存空間只有在相應的遞歸調用結束后,才能被釋放。

        采用算法1,對于n階行列式A,需進行大量的遞歸調用。對于n階行列式A,設遞歸調用的總次數(shù)為an。通過分析,所需完成的遞歸調用次數(shù)可用數(shù)列an=n·an-1+1 (其中a1=1)進行計算。[an=n?an-1+1]等式兩邊同除以n!,得:

        [ann!=an-1(n-1)!+1n!an=n!?i=1n1i!]

        根據(jù)上式,當n=6時,a6=1 237;當n=10時,a10=6 235 301。行列式每增加一階,則遞歸調用的次數(shù)增加得特別快,函數(shù)調用的開銷相當大。但對于算法2,當n=6時,只需遞歸調用6次,可見算法2的運算速度相當快。

        4 結 語

        n元一次線性方程有惟一解的充要條件是相對應的n階行列式不為零。本文討論了n階行列式求值的兩種算法,并從精度和執(zhí)行效率上進行了分析。算法1在精度上較好,但計算的階數(shù)有限;運算速度上,算法2遠遠高于算法1。因此,若求解低階線性方程組,且要求的計算精度較高,可采用算法1;若求解高階線性方程組,例如,對于測量平差中需要求解高階線性方程組時,可采用算法2。兩種算法計算結果都很穩(wěn)定,但算法1較算法2更穩(wěn)定,算法2的運算速度遠遠快于算法1。這兩種算法可根據(jù)實際情況選用。

        參考文獻

        [1] 張新功.行列式的計算方法探討[J].重慶師范大學學報:自然科學版,2011(7):88?92.

        [2] 陳云坤,趙平利.用矩陣分塊探求計算高階行列式的新方法[J].貴州大學學報:自然科學版,2005(8):227?231.

        [3] 楊立英,李成群.n階行列式的計算方法與技巧[J].廣西師范學院學報:自然科學版,2006(3):98?105.

        [4] 屈曉.探討用C語言實現(xiàn)求解行列式[J].電腦知識與技術,2011(10):6907?6908.

        [5] 黃良斌.用C語言實現(xiàn)解線性方程組的高斯消去法[J].數(shù)學學習與研究,2009(7):104?105.

        [6] 衛(wèi)洪春.COCH圖形的遞歸與非遞歸算法研究[J].計算機與信息技術,2011(12):42?46.

        子式的乘積之和的變量

        for(int j = 0 ; j < n ; j++){//累加最后一行各元素與其對應代數(shù)余子式的乘積

        動態(tài)生成n行n列的臨時數(shù)組double **p1,用以保存p 中的元素

        將n階行列式p的各元素保存在n階行列式p1的對應元素中

        保存元素p1[n-1][j]的腳標之和至變量pt

        保存元素p1[n-1][j]至變量ptd

        將ptd所在列右側的各列元素依次向左移動一列。

        動態(tài)生成(n-1)階行列式double **tem

        將行列式p1左上角的(n-1)階行列式轉存至tem

        釋放數(shù)組p1

        sum += ptd * pow(-1,pt) * GetValue(tem,n-1);

        //累加p[n-1][j]與其代數(shù)余子式之積

        釋放數(shù)組tem

        }

        返回該行列式的值sum

        }

        采用代數(shù)余子式計算行列式,思路清晰,計算簡單,是計算低階行列式的有效方法。

        2.2 行列式的基本性質

        根據(jù)第2.1節(jié)的代數(shù)余子式法,若能利用行列式的性質1、性質2將n階行列式A(見圖2)化簡為最后一列元素中除ann≠0(若存在),而該列其余元素均為零的形式(見圖3),則可大大減少計算量。此時行列式的值是ann*A(n-1)(n-1),此式仍具有遞歸函數(shù)的特點。算法設計如算法2所述。

        圖2 n階行列式

        圖3 變換后的第n列

        算法2:

        double GetLineTran(double **p,int n){

        若階數(shù)n=1,返回p[0][0]

        double result = 1.0; //記錄行列式中行交換的次數(shù),每交換

        一次result = result*(-1)

        bool flag = false

        //設置行列式最右邊列中是否存在某個元素不為0

        for(i = 0; i < n; i++){//i表示行號

        若第i行最右邊的元素不等于0,則{

        flag = true;

        若i不是最后一行n-1,則{

        交換第i行與第n-1行對應的所有元素 進行一次行變換: result *= -1.0;

        }

        break;

        }

        }

        if(!flag) return 0; //行列式最右側列的所有元素全為0,則行列式的值為0

        for(i = 0; i < n-1; i++){ // i表示行號,用p[n-1][n-1]將

        P[i][n?1]按規(guī)則變換為0(i從0到n-2)

        若行列式p[i][n-1]≠0,則{

        計算用p[n-1][n-1]將p[i][n-1]變?yōu)?的比例因子t=p[i][n-1]/p[n-1][n-1]

        將第n-1行的各個元素乘以-t,加到第i行的對應元素上(注:行列式的值不變,此時行列式具有圖3的形式)。

        }

        }

        return result * p[n-1][n-1] * GetLineTran(p,n-1);//返加行列式的值

        }

        以上兩種算法均采用遞歸思想完成計算[4?6]。對于算法2,可以非常方便地轉換為非遞歸算法。兩種算法的運算結果如圖4所述。

        圖4 兩種算法的結果

        3 算法比較

        3.1 精度分析

        上述兩種算法均可計算n階行列式的值。算法1中,由于運算過程中只有加減法和乘法運算,除非溢出,否則,計算結果沒有精度損失。算法2中,由于施行了行變換,除了加、減、乘法運算外,還涉及除法運算,因此在計算中有精度損失。

        3.2 效率分析

        算法2在執(zhí)行過程中,由于所有的運算數(shù)據(jù)均在二維數(shù)組p中,不需要額外的空間開銷。對于n階行列式,其遞歸調用的次數(shù)為n,適合計算較高階的行列式。實驗表明,在VC 6.0環(huán)境下,若行列式的元素值在[0,9]間,最高可計算252階的行列式(見圖5)。

        圖5 算法2所示的高階行列式運算結果

        對于算法1,利用代數(shù)余子式完成計算的過程中,需開辟大量的額外空間,并且大量的內存空間只有在相應的遞歸調用結束后,才能被釋放。

        采用算法1,對于n階行列式A,需進行大量的遞歸調用。對于n階行列式A,設遞歸調用的總次數(shù)為an。通過分析,所需完成的遞歸調用次數(shù)可用數(shù)列an=n·an-1+1 (其中a1=1)進行計算。[an=n?an-1+1]等式兩邊同除以n!,得:

        [ann!=an-1(n-1)!+1n!an=n!?i=1n1i!]

        根據(jù)上式,當n=6時,a6=1 237;當n=10時,a10=6 235 301。行列式每增加一階,則遞歸調用的次數(shù)增加得特別快,函數(shù)調用的開銷相當大。但對于算法2,當n=6時,只需遞歸調用6次,可見算法2的運算速度相當快。

        4 結 語

        n元一次線性方程有惟一解的充要條件是相對應的n階行列式不為零。本文討論了n階行列式求值的兩種算法,并從精度和執(zhí)行效率上進行了分析。算法1在精度上較好,但計算的階數(shù)有限;運算速度上,算法2遠遠高于算法1。因此,若求解低階線性方程組,且要求的計算精度較高,可采用算法1;若求解高階線性方程組,例如,對于測量平差中需要求解高階線性方程組時,可采用算法2。兩種算法計算結果都很穩(wěn)定,但算法1較算法2更穩(wěn)定,算法2的運算速度遠遠快于算法1。這兩種算法可根據(jù)實際情況選用。

        參考文獻

        [1] 張新功.行列式的計算方法探討[J].重慶師范大學學報:自然科學版,2011(7):88?92.

        [2] 陳云坤,趙平利.用矩陣分塊探求計算高階行列式的新方法[J].貴州大學學報:自然科學版,2005(8):227?231.

        [3] 楊立英,李成群.n階行列式的計算方法與技巧[J].廣西師范學院學報:自然科學版,2006(3):98?105.

        [4] 屈曉.探討用C語言實現(xiàn)求解行列式[J].電腦知識與技術,2011(10):6907?6908.

        [5] 黃良斌.用C語言實現(xiàn)解線性方程組的高斯消去法[J].數(shù)學學習與研究,2009(7):104?105.

        [6] 衛(wèi)洪春.COCH圖形的遞歸與非遞歸算法研究[J].計算機與信息技術,2011(12):42?46.

        子式的乘積之和的變量

        for(int j = 0 ; j < n ; j++){//累加最后一行各元素與其對應代數(shù)余子式的乘積

        動態(tài)生成n行n列的臨時數(shù)組double **p1,用以保存p 中的元素

        將n階行列式p的各元素保存在n階行列式p1的對應元素中

        保存元素p1[n-1][j]的腳標之和至變量pt

        保存元素p1[n-1][j]至變量ptd

        將ptd所在列右側的各列元素依次向左移動一列。

        動態(tài)生成(n-1)階行列式double **tem

        將行列式p1左上角的(n-1)階行列式轉存至tem

        釋放數(shù)組p1

        sum += ptd * pow(-1,pt) * GetValue(tem,n-1);

        //累加p[n-1][j]與其代數(shù)余子式之積

        釋放數(shù)組tem

        }

        返回該行列式的值sum

        }

        采用代數(shù)余子式計算行列式,思路清晰,計算簡單,是計算低階行列式的有效方法。

        2.2 行列式的基本性質

        根據(jù)第2.1節(jié)的代數(shù)余子式法,若能利用行列式的性質1、性質2將n階行列式A(見圖2)化簡為最后一列元素中除ann≠0(若存在),而該列其余元素均為零的形式(見圖3),則可大大減少計算量。此時行列式的值是ann*A(n-1)(n-1),此式仍具有遞歸函數(shù)的特點。算法設計如算法2所述。

        圖2 n階行列式

        圖3 變換后的第n列

        算法2:

        double GetLineTran(double **p,int n){

        若階數(shù)n=1,返回p[0][0]

        double result = 1.0; //記錄行列式中行交換的次數(shù),每交換

        一次result = result*(-1)

        bool flag = false

        //設置行列式最右邊列中是否存在某個元素不為0

        for(i = 0; i < n; i++){//i表示行號

        若第i行最右邊的元素不等于0,則{

        flag = true;

        若i不是最后一行n-1,則{

        交換第i行與第n-1行對應的所有元素 進行一次行變換: result *= -1.0;

        }

        break;

        }

        }

        if(!flag) return 0; //行列式最右側列的所有元素全為0,則行列式的值為0

        for(i = 0; i < n-1; i++){ // i表示行號,用p[n-1][n-1]將

        P[i][n?1]按規(guī)則變換為0(i從0到n-2)

        若行列式p[i][n-1]≠0,則{

        計算用p[n-1][n-1]將p[i][n-1]變?yōu)?的比例因子t=p[i][n-1]/p[n-1][n-1]

        將第n-1行的各個元素乘以-t,加到第i行的對應元素上(注:行列式的值不變,此時行列式具有圖3的形式)。

        }

        }

        return result * p[n-1][n-1] * GetLineTran(p,n-1);//返加行列式的值

        }

        以上兩種算法均采用遞歸思想完成計算[4?6]。對于算法2,可以非常方便地轉換為非遞歸算法。兩種算法的運算結果如圖4所述。

        圖4 兩種算法的結果

        3 算法比較

        3.1 精度分析

        上述兩種算法均可計算n階行列式的值。算法1中,由于運算過程中只有加減法和乘法運算,除非溢出,否則,計算結果沒有精度損失。算法2中,由于施行了行變換,除了加、減、乘法運算外,還涉及除法運算,因此在計算中有精度損失。

        3.2 效率分析

        算法2在執(zhí)行過程中,由于所有的運算數(shù)據(jù)均在二維數(shù)組p中,不需要額外的空間開銷。對于n階行列式,其遞歸調用的次數(shù)為n,適合計算較高階的行列式。實驗表明,在VC 6.0環(huán)境下,若行列式的元素值在[0,9]間,最高可計算252階的行列式(見圖5)。

        圖5 算法2所示的高階行列式運算結果

        對于算法1,利用代數(shù)余子式完成計算的過程中,需開辟大量的額外空間,并且大量的內存空間只有在相應的遞歸調用結束后,才能被釋放。

        采用算法1,對于n階行列式A,需進行大量的遞歸調用。對于n階行列式A,設遞歸調用的總次數(shù)為an。通過分析,所需完成的遞歸調用次數(shù)可用數(shù)列an=n·an-1+1 (其中a1=1)進行計算。[an=n?an-1+1]等式兩邊同除以n!,得:

        [ann!=an-1(n-1)!+1n!an=n!?i=1n1i!]

        根據(jù)上式,當n=6時,a6=1 237;當n=10時,a10=6 235 301。行列式每增加一階,則遞歸調用的次數(shù)增加得特別快,函數(shù)調用的開銷相當大。但對于算法2,當n=6時,只需遞歸調用6次,可見算法2的運算速度相當快。

        4 結 語

        n元一次線性方程有惟一解的充要條件是相對應的n階行列式不為零。本文討論了n階行列式求值的兩種算法,并從精度和執(zhí)行效率上進行了分析。算法1在精度上較好,但計算的階數(shù)有限;運算速度上,算法2遠遠高于算法1。因此,若求解低階線性方程組,且要求的計算精度較高,可采用算法1;若求解高階線性方程組,例如,對于測量平差中需要求解高階線性方程組時,可采用算法2。兩種算法計算結果都很穩(wěn)定,但算法1較算法2更穩(wěn)定,算法2的運算速度遠遠快于算法1。這兩種算法可根據(jù)實際情況選用。

        參考文獻

        [1] 張新功.行列式的計算方法探討[J].重慶師范大學學報:自然科學版,2011(7):88?92.

        [2] 陳云坤,趙平利.用矩陣分塊探求計算高階行列式的新方法[J].貴州大學學報:自然科學版,2005(8):227?231.

        [3] 楊立英,李成群.n階行列式的計算方法與技巧[J].廣西師范學院學報:自然科學版,2006(3):98?105.

        [4] 屈曉.探討用C語言實現(xiàn)求解行列式[J].電腦知識與技術,2011(10):6907?6908.

        [5] 黃良斌.用C語言實現(xiàn)解線性方程組的高斯消去法[J].數(shù)學學習與研究,2009(7):104?105.

        [6] 衛(wèi)洪春.COCH圖形的遞歸與非遞歸算法研究[J].計算機與信息技術,2011(12):42?46.

        国产av无码专区亚洲av手机麻豆| 亚洲国产精品一区二区久久恐怖片 | 国产无码swag专区| 亚洲双色视频在线观看| 一区二区视频在线国产| 亚洲av综合av国产av中文| 欧美人与动人物姣配xxxx| 欧美韩国精品另类综合| 男女视频在线观看一区二区| 丝袜美腿亚洲一区二区| 国产丝袜无码一区二区三区视频| 亚洲AV无码精品一区二区三区l| 一区二区三区视频免费观看在线| 人妻少妇中文字幕在线| 成人免费看www网址入口| 色伊人国产高清在线| 日本一区二区三区精品不卡| 国产精品无码翘臀在线观看 | 亚洲av熟妇高潮30p| 久久精品国产av大片| 丝袜美腿福利视频在线| 精品久久久久久成人av| 2021久久最新国产精品| 成人精品国产亚洲av久久| 少妇高潮在线精品观看| 无码av无码天堂资源网| 国产亚洲女在线线精品| 亚洲国产高清一区av| 亚洲爆乳精品无码一区二区三区| 小sao货水好多真紧h视频| 中国人妻沙发上喷白将av| 二区视频在线免费观看| 免费看美女被靠的网站| 免费毛片视频网站| 亚洲福利视频一区二区三区| 99久久精品免费看国产一区二区三区| 亚洲日韩精品欧美一区二区一| 亚洲AV小说在线观看| 亚洲国产精品久久无人区| 亚洲avav天堂av在线网爱情| 人妻精品丝袜一区二区无码AV|