• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Tauruser

            Enjoy Every Day
            posts - 34, comments - 95, trackbacks - 0, articles - 5
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            3.2 Gauss消去法

            3.2.1 順序消去法

              Gauss消去法就是將方程組(3.1.1)通過(n-1)步消元,將(3.1.1)轉(zhuǎn)化為上三角方程組
                   (3.2.1)
            再回代求此方程組的解.
              下面記增廣矩陣,即
               
              第1步 設(shè),計算l,記為,若用第一行加到第i行,可消去,用Gauss變換矩陣表示
                
            令   
            其中
              一般地,假定已完成了(k-1)步消元,即已將轉(zhuǎn)化為以下形式:
               
              第k步,假定,計算
                   (3.2.2)
            ,則
               
            其中
                 (3.2.3).
            當k=1,2,…,n-1則可得到,即方程組(3.2.1).

              直接回代解(3.2.1)得,
                 (3.2.4)
            并且有,由以上順序消去過程可得如下定理.
              定理2.1 設(shè)非奇異,則通過兩行互換總可使,k=1,2,…,n-1.可將方程組(3.1.1)轉(zhuǎn)化為(3.2.1)并求得方程組(3.1.1)的解為(3.2.4),且有.
              如果不做行交換,則使的條件如下.

              定理2.2 非奇異,且各階順序主子式, 則,k=1,2,…,n-1.
              證明 用歸納法,當,故.現(xiàn)假設(shè)(k-1)成立,即,對i=1,2,…,k-1已推出,故Gauss消去法能進行(k-1)步消元,A已約化為,即
               

                 

            對k=1,2,…,n均成立,證畢.
              在整個消去法消元過程中,k從1到(n-1)共需乘除法運算次數(shù)為
                 
            加減法次數(shù)為
                 
            回代過程中由公式(3.2.4)可知乘除法次數(shù)為,加減法次數(shù)為,于是Gauss消去法的乘除法總次數(shù)為,加減法次數(shù)為
              例3.4 用Gauss消去法解方程組
                  
            并求detA.
              解 消元得
               
            再由(3.2.4)回代,得解

            講解:

              Gauss 消去法是將方程組AX=b,通過消元轉(zhuǎn)化為上三角方程組(3,2,1)求解,消元第一步做完后有
                     
              用矩陣表示
              第K-1步完成后得到
              當,可做K步,得到
              得到,對應(yīng)的方程組就是(3.2.1),利用公式(3.2.4)就可求得解。
              定理2.2給出了進行順序消去法的條件,即A的所有順序生子式,而方程(3.1.1)解存在唯一的條件是

            好了,原理講完了,貼我的例程。

            #include? < iostream >
            #include?
            < vector >
            #include?
            < cmath >
            using ? namespace ?std;
            class ?CGAUSSSOLVEEQU
            {
            private :
            ????vector
            < vector < double >> ?m_equset;
            ????vector
            < double > ?m_answer;
            ????unsigned?
            int ?m_n;
            public :
            ????
            void ?inputEquSet();
            ????
            void ?solveEquSet();
            ????
            void ?outputAnswer();
            }
            ;
            void ?CGAUSSSOLVEEQU::inputEquSet()
            {
            ????
            double ?dtemp;
            ????vector
            < double > ?vtemp;
            ????cout
            << " 請輸入你的方程個數(shù): " ;
            ????cin
            >> m_n;
            ????cout
            << " 請按照向量的形式輸入各變量的系數(shù)。最后一位為b。每個方程一行: " << endl;
            ????
            for (unsigned? int ?i( 0 );i < m_n; ++ i)
            ????
            {
            ????????m_equset.push_back(vtemp);
            ????????
            for (unsigned? int ?j( 0 );j <= m_n; ++ j)
            ????????
            {????
            ????????????cin
            >> dtemp;
            ????????????m_equset[i].push_back(dtemp);
            ????????}

            ????????
            if (m_equset[i].size() != m_n + 1 )
            ????????
            {
            ????????????cout
            << " 輸入有誤,請重新輸入上一個方程。 " << endl;
            ????????????
            -- i;
            ????????}

            ????}

            ????
            }


            void ?CGAUSSSOLVEEQU::solveEquSet()
            {
            ????vector
            < vector < double >> ::iterator?iter;
            ????iter
            = m_equset.begin();
            ????
            for (unsigned? int ?m( 0 );m < m_n - 1 ; ++ m)
            ????
            {
            ????????
            // 將絕對值最大的主元素移上去。此舉是為了減少誤差
            ???????? for (vector < vector < double >> ::iterator?iter2 = iter + 1 ;iter2 != m_equset.end(); ++ iter2)
            ????????
            {
            ????????????
            if (fabsl(iter -> front()) < fabsl(iter2 -> front()))
            ????????????
            {
            ????????????????swap(
            * iter, * iter2);
            ????????????}

            ????????}

            ????????
            // 進行消元
            ???????? for (unsigned? int ?i = m + 1 ;i < m_n; ++ i)
            ????????
            {
            ????????????
            double ?dm;
            ????????????dm
            = m_equset[i][m] / m_equset[m][m];
            ????????????
            for (unsigned? int ?j = m;j < m_n + 1 ; ++ j)
            ????????????
            {
            ????????????????m_equset[i][j]
            -= dm * m_equset[m][j];
            ????????????}

            ????????}

            ????????
            ++ iter;
            ????}

            ????
            // 初始化m_answer向量
            ???? for (unsigned? int ?i( 0 );i < m_n; ++ i)?m_answer.push_back( 0 );
            ????
            // 求解答案
            ????m_answer[m_n - 1 ] = m_equset[m_n - 1 ][m_n] / m_equset[m_n - 1 ][m_n - 1 ];

            ????
            for ( int ?i = m_n - 2 ;i >= 0 ; -- i)
            ????
            {
            ????????m_answer[i]
            = m_equset[i][m_n];
            ????????
            for ( int ?j = m_n - 1 ;j > i; -- j)
            ????????????m_answer[i]
            -= m_answer[j] * m_equset[i][j];
            ????????m_answer[i]
            /= m_equset[i][i];
            ????}


            ????
            }


            void ?CGAUSSSOLVEEQU::outputAnswer()
            {
            ????
            for (unsigned? int ?i( 1 );i <= m_n; ++ i)
            ????
            {
            ????????cout
            << " x( " << i << " )= " << m_answer[i - 1 ] << endl;
            ????}

            }


            int ?main()
            {
            ????CGAUSSSOLVEEQU?myEqu;
            ????myEqu.inputEquSet();
            ????myEqu.solveEquSet();
            ????myEqu.outputAnswer();
            ????
            return ? 0 ;
            }


            // Power?By?Tauruser?2006.6.4

            Feedback

            # re: Gauss消去法直接求解方程組(附例程)  回復  更多評論   

            2006-11-17 13:38 by tim
            ding

            # re: Gauss消去法直接求解方程組(附例程)  回復  更多評論   

            2007-06-01 11:12 by Snowfox
            請問LZ:
            能發(fā)下具體的結(jié)果嗎?我不明白你的輸入格式,還有能解幾元幾次的方程組。謝謝了!勞駕!
            期待中。。。

            # re: Gauss消去法直接求解方程組(附例程)  回復  更多評論   

            2007-06-10 12:02 by 星夢情緣
            我的BLOG集齊了各重解線性方程的方法,任意方程都可以解的

            # re: Gauss消去法直接求解方程組(附例程)  回復  更多評論   

            2008-06-04 20:11 by
            有一個小錯誤

            # re: Gauss消去法直接求解方程組(附例程)  回復  更多評論   

            2008-06-04 20:11 by
            for ( int i = m_n - 2 ;i >= 0 ; -- i)

            i 重復定義了,不過謝謝你呀!

            # re: Gauss消去法直接求解方程組(附例程)  回復  更多評論   

            2008-06-04 20:12 by
            好程序

            # re: Gauss消去法直接求解方程組(附例程)  回復  更多評論   

            2009-03-25 22:06 by nan
            能把改后的程序發(fā)上去嗎,謝謝
            日日狠狠久久偷偷色综合免费| 久久免费视频6| 久久免费视频一区| 久久精品成人| 亚洲AV日韩精品久久久久久| 国内精品伊人久久久久777| 久久久亚洲裙底偷窥综合| 国产精品久久毛片完整版| 伊人久久综在合线亚洲2019| 久久久亚洲AV波多野结衣| 精品久久久久久无码专区| 久久综合久久美利坚合众国| 久久精品国产99久久香蕉| 久久久国产99久久国产一| 久久国产免费| 久久精品无码一区二区无码| 亚洲日本va午夜中文字幕久久| 精品久久久久久无码人妻热| 国产V亚洲V天堂无码久久久| 欧美久久一级内射wwwwww.| 色8久久人人97超碰香蕉987| 久久久www免费人成精品| 久久精品国产亚洲一区二区| 国产精品美女久久久久网| 亚洲欧洲中文日韩久久AV乱码| …久久精品99久久香蕉国产| 国产精品乱码久久久久久软件| 99久久精品免费国产大片| 久久人人爽人人爽人人片AV不| 合区精品久久久中文字幕一区| 99久久综合国产精品二区| 国产AV影片久久久久久| 久久亚洲美女精品国产精品| 久久精品久久久久观看99水蜜桃| 久久久久无码中| 久久男人AV资源网站| 久久久久97国产精华液好用吗| 青青草国产精品久久久久| 日本国产精品久久| 久久涩综合| 色播久久人人爽人人爽人人片aV |