1. 程式人生 > >C# 多元一次方程演算法,高斯消元列主消元法比較

C# 多元一次方程演算法,高斯消元列主消元法比較

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApplication2
{
    class Program
    {


        static void Main(string[] args)
        {
            Console.Title = "多元一次方程高斯消元列主消元計算";
            Console.WindowWidth = 80;
            Console.BufferHeight = 100;


            //float[,] c = new float[,]
            //{ 
            //{ 1, 1, 1,6}, 
            //{ 1, 3, -2 ,1}, 
            //{ 2, -2, 1 ,1} 
            //};


            //float[] res = LieZhuXiaoYuan(c);
            while(true)
            {
                float[,] d = read();
                Console.Write("\n\n高斯消元計算\n\n");
                GaosiXiaoYuan(d);
                Console.Write("\n\n列主消元計算\n\n");
                LieZhuXiaoYuan(d);


            }
        }
        private static float[,] read()
        {


            Console.Write("\n\n\n\n\n");
            Console.Write("多元一次方程高斯消元列主消元計算\n");
            Console.Write("|-----------------------------\n");
            Console.Write("|1.1348 3.8326 1.1651 3.4017 9.5342\n");
            Console.Write("|0.5301 1.7875 2.5330 1.5435 6.3941\n");
            Console.Write("|3.4129 4.9317 8.7643 1.3142 18.4231\n");
            Console.Write("|1.2371 4.9998 10.6721 0.0147 16.9237\n");
            Console.Write("|-----------------------------\n");
            Console.Write("|請輸入係數0,計算例題,如:\n");
            string ch = Console.ReadLine();
            if(ch == "0")
            {
                float[,] exp = new float[,]
                { 
                { 1.1348F, 3.8326F, 1.1651F, 3.4017F, 9.5342F}, 
                { 0.5301F, 1.7875F, 2.5330F, 1.5435F, 6.3941F}, 
                { 3.4129F, 4.9317F, 8.7643F, 1.3142F, 18.4231F},
                { 1.2371F, 4.9998F, 10.6721F, 0.0147F, 16.9237F}
                };
                return exp;
            }
            else
            {


                Console.Write("|請輸入係數矩陣行列數目,如:4 5\n");
                string input = Console.ReadLine();
                string[] inputnum = input.Split(' ');
                int _rows = Int32.Parse(inputnum[0]);
                int _cols = Int32.Parse(inputnum[1]);
                float[,] data = new float[_rows, _cols];
                Console.Write("|請輸入係數矩陣行列,如:上面例子\n");
                for (int i = 0; i < _rows; i++)
                {
                    input = Console.ReadLine();
                    inputnum = input.Split(' ');
                    for (int j = 0; j < _cols; j++)
                    {
                        data[i, j] = float.Parse(inputnum[j]);
                        data[i, j] *= 1;
                    }
                }
                return data;    
            }
        }
        private static void PrintProc(float[,] a, int k)
        {
            Console.Write(string.Format("第{0}次消元結果如下:" + Environment.NewLine, k + 1));
            for (int i = 0; i < a.GetLength(0); i++)
            {
                string tt = "";
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    tt += string.Format("{0:N7}\t", a[i, j]);
                }
                Console.Write(tt);
            }
        }


        private static void Print(float[] x)
        {
            Console.Write("結果為:" + Environment.NewLine);
            for (int i = 0; i < x.GetLength(0); i++)
            {
                Console.Write(string.Format("x{0}=  {1:N7}" + Environment.NewLine, i, x[i]));
            }
        }


        static float[] GaosiXiaoYuan(float[,]c)
        {
            float[,] a = new float[c.GetLength(0),c.GetLength(1)];
            Array.Copy(c, a, c.GetLength(0)*c.GetLength(1));                
            int _rows = a.GetLength(0);
            int _cols = a.GetLength(1);
            float[,] m = new float[_rows, _cols];
            float[] x = new float[_rows];


            //消元計算  
            for (int k = 0; k < _rows - 1; k++)
            {
                for (int i = k; i < _cols - 1; i++)
                {
                    m[i,k] = a[i,k] / a[k,k];
                    for (int j = k; j < _cols; j++)
                    {
                        a[i,j] -= m[i,k] * a[k,j];
                    }
                }
                //for (int i = k + 1; i <= n; i++)
                //{
                //    b[i] -= m[i,k] * b[k];
                //}
                PrintProc(a,k);//輸出中間計算過程  
            }
            //回代求解  
            //x[n] = b[n] / a[n,n];
            for (int i = _rows - 1; i > 0; i--)
            {
                x[i] = a[i, _cols - 1];
                for (int j = i + 1; j <_cols - 1; j++)
                    x[i] -= a[i,j] * x[j];
                x[i] /= a[i,i];
            }
            //輸出結果  
            Print(x);
            return x;
        }


        static float[] LieZhuXiaoYuan(float[,] c)
        {
            float[,] a = new float[c.GetLength(0), c.GetLength(1)];
            Array.Copy(c, a, c.GetLength(0) * c.GetLength(1));
            const float e = 0.00001F;
            int _rows = a.GetLength(0);
            int _cols = a.GetLength(1);
            float[] x = new float[_rows];




            for (int k = 0; k < _rows - 1; k++)
            {
                //選主元[這一列的絕對值最大值]  
                float ab_max = -1;
                int max_ik = 0;
                for (int i = k; i < _cols - 1; i++)
                {
                    if (Math.Abs(a[i, k]) > ab_max)
                    {
                        ab_max = Math.Abs(a[i, k]);
                        max_ik = i;
                    }
                }
                //交換行處理[先判斷是否為0矩陣]  
                if (ab_max < e)
                {//0矩陣情況  
                    Console.Write("0矩陣情況");
                    break;
                }
                else if (max_ik != k)
                {//是否是當前行,不是交換  
                    float temp;
                    for (int j = 0; j < _cols; j++)
                    {
                        temp = a[max_ik, j];
                        a[max_ik, j] = a[k, j];
                        a[k, j] = temp;
                    }
                }
                //消元計算  
                for (int i = k + 1; i < _rows; i++)
                {
                    float kk = a[i, k] / a[k, k];
                    for (int j = k; j < _cols; j++)
                    {
                        a[i, j] -= kk * a[k, j];
                    }
                }
                //輸出中間計算過程 
                PrintProc(a, k);
                if (k < _rows - 2)
                    continue;
                else
                {
                    if (Math.Abs(a[_rows - 1, _rows - 1]) < e)
                    {
                        Console.Write("0矩陣情況");
                        break;
                    }
                    else
                    {//回代求解 
                        for (int i = _rows - 1; i >= 0; i--)
                        {
                            x[i] = a[i, _cols - 1];
                            for (int j = i + 1; j < _cols - 1; j++)
                                x[i] -= a[i, j] * x[j];
                            x[i] /= a[i, i];
                        }
                    }
                }
            }
            //輸出結果  
            Print(x);
            return x;
        }


    }




}
/*
書上高斯消元的例子:
1 1 1 
1 3 -2
2 -2 1

6 1 1
*/
/*
書上列主消元的例子:
-0.002 2 2
1 0.78125 0
3.996 5.5625 4

0.4 1.3816 7.4178
*/

列主元素消去法是為控制舍入誤差而提出來的一種演算法,在Gauss消去法的消元過程中,若出現a=0,則消元無法進行,即使其不為0,但很小,把它作為除數,就會導致其他元素量級的巨大增長和舍入誤差的擴散,最後使計算結果不可靠.使用列主元素消去法計算,基本上能控制舍入誤差的影響,並且選主元素比較方便.


參考:http://www.cnblogs.com/zjutlitao/p/3637411.html

相關推薦

C# 多元一次方程演算法比較

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleAp

c++實現線性迴歸()(附python實現)

前言 寫這次blog的契機是上次筆試的時候,遇到了這個問題 當時以為numpy庫是可以用的,就先寫了個python版,結果並不能用。。 最後憤然寫了個c++版 不過最後一個小問題導致我差了兩分鐘沒交上去程式碼,所以這一版原始碼只是通過了案例但沒有提交ac。。

斯坦福大學機器學習筆記——異常檢測演算法分佈、多元分佈、異常檢測演算法

異常檢測問題介紹: 異常檢測演算法主要用於無監督學習問題,但從某種角度看它又類似於一種有監督學習的問題,下面我們從一個例子中簡單介紹一下什麼是異常檢測問題。 比如我們有一個飛機引擎製造商,對於一個新造出的飛機引擎我們想判斷這個引擎是不是異常的。 假如我們有

普通模糊動感模糊模糊演算法實現

     模糊演算法在實際應用中經常回碰到,這裡總結下幾種模糊演算法,以便將來的需要。      #ifdef GL_ES precision mediump float; #endif uniform float mode;//0普通模糊 1高斯模糊 2動感模糊 unif

P3389 【模板】(模板

思路:沒學線代的可以去學一下,很簡單的。 直接看落谷的解析吧,感覺很好了。 程式碼: #include<cstdio> #include<cmath> const

圖片處理的幾種演算法(毛玻璃效果模糊效果舊時光效果lomo效果暖意效果)

毛玻璃效果:高斯模糊效果: //高斯模糊,毛玻璃 //低於Android4.2可以用Java原生程式碼實現。但是效率會低不少:這完全是一種妥協的方式,不推薦 public Bitmap fastblur(Context context, Bitmap sentBitma

Bzoj3270:博物館:概率與期望

題目連結:博物館 我們用id[i][j]代表一個人到了i另一個人在j的狀態 假設id[i][j]代表的狀態可以一步走到id[x][y]代表的狀態,那麼id[x][y]一步也可以走到id[i][j] 所以狀態之間的轉移形成了一個環,這時候要用高斯消元來解決一下了 設a[id[

基於opencv下對視頻的灰度變換濾波canny邊緣檢測處理同窗體顯示並保存

rmi 其他 AS info ali 利用 測試結果 14. 中間 如題:使用opencv打開攝像頭或視頻文件,實時顯示原始視頻,將視頻每一幀依次做灰度轉換、高斯濾波、canny邊緣檢測處理(原始視頻和這3個中間步驟處理結果分別在一個窗口顯示),最後將邊緣檢測結果保存為一個

數值分析(三):C++實現線性方程組的-賽德爾迭代

線性方程組的直接解法之後,就輪到迭代解法了,直接解法針對的是低階稠密矩陣,資料量較少,而工程上有更多的是高階係數矩陣,使用迭代法效率更高,佔用的空間較小。 迭代法的最基本思想就是由初始條件,比如說初始解向量隨便列舉一個,就0向量也行,然後進行迭代,k到k+1,一步一步從k=1開始去逼近真實解

生成學習演算法_判別分析_樸素貝葉_斯坦福CS229_學習筆記

Part IV Generative Learning Algorithms 回顧上一部分的內容,我們解決問題的出發點在於直接對p(y|x;)建模:如線性迴歸中y建模為高斯分佈,邏輯迴歸y建模為伯努利分佈。這樣建模的好處在於可以直接得到x到y的對映關係,理解起來也比較直接。這樣建模

【機器學習】EM演算法混合模型學習中的應用

前言 EM演算法,此部落格介紹了EMEM演算法相關理論知識,看本篇部落格前先熟悉EMEM演算法。 本篇部落格打算先從單個高斯分佈說起,然後推廣到多個高斯混合起來,最後給出高斯混合模型引數求解過程。 單個高斯分佈 假如我們有一些資料,這些資料來自同一個

EM演算法混合模型

      由k個高斯模型加權組成,α是各高斯分佈的權重,Θ是引數。對GMM模型的引數估計,就要用EM演算法。更一般的講,EM演算法適用於帶有隱變數的概率模型的估計,即不同的高斯分佈所對應的類別變數。   為何不能使用極大似然估計,如果直接使用極大似然估計

Glide中MultiTransformation使用,實現多種變換效果組合(圓形圓角模糊黑白...)

Glide中MultiTransformation使用 MultiTransformation可以實現多個Transformation效果結合實現一些需求 1、例如Glide載入一張圖片,我們需要把這張

Python實現-----使用隨機梯度演算法核模型進行最小二乘學習

(1)高斯核模型                           其中為樣本。可以看出,核模型的均值是以的元素進行計算的。 (2)隨機梯度下降法 (3)python 程式碼實現 import numpy as np import matplotlib

梯度下降牛頓-牛頓迭代附程式碼實現

---------------------梯度下降法------------------- 梯度的一般解釋: f(x)在x0的梯度:就是f(x)變化最快的方向。梯度下降法是一個最優化演算法,通常也稱為最速下降法。 假設f(x)是一座山,站在半山腰,往x方向走1米,高度上

概率函式概率密度函式概率分佈函式分佈

數學基礎複習之概率論(大部分來自百度百科和課本內容) 1.概率函式: (百度說的概率函式一般指概率分佈函式,但課件裡邊提到概率函式時是如下意思↓) 離散型隨機變數的分佈的表現形式 注:截圖來自同濟大學概率論與數理統計課件 2.概率密度函式: 在數學中,連續型隨機變數的概率

OpenCV3之——線性濾波(方框濾波均值濾波濾波)

數字影象處理線性濾波:     輸出影象fo(x,y)= T[ fi(x,y) ],T是線性運算元,即:輸出影象上每個畫素點的值都是由輸入影象各畫素點值加權求和的結果。 非線性濾波的運算元中包含了取絕對值、置零等非線性運算。     線性濾波器的原始資料與濾波結果是一種算術運

EM(期望最大演算法)在混合模型中的python實現

以下程式碼僅實現了兩個高斯混合模型在均勻分佈條件下的引數估計,想要實現完全隨機的非均勻分佈的多高斯混合模型,可在上面加以修改。具體參考書中的9.3.2節 ##python實現## import math #import copy import numpy

【機器學習】機器學習(十二、十三):K-means演算法混合模型

簡介:         本節介紹STANFORD機器學習公開課中的第12、13集視訊中的演算法:K-means演算法、高斯混合模型(GMM)。(9、10、11集不進行介紹,略過了哈) 一、K-means演算法         屬於無監督學習的聚類演算法,給定一組未標定的資料