C#计算线性方程组

    首先不得不说数学的强大。如果没学计算方法而用线性代数学的克拉默法则不知道实现起来有多复杂,算20个未知数的方程组不知道要算多少年,而用高斯消去法只需要零点零几秒,膜拜了。

    下面是计算方法实验时用C#写的代码,用的是列主元消去法。

[code]

        staticvoid guass()

        {

            double[,] a=newdouble[10,10];

            double c;

            int n, i, j, k, r;

            string path="D:\input.txt";

            string st;

            string[] st2=newstring[10];

            System.IO.FileStream fs=new System.IO.FileStream(path,System.IO.FileMode.Open);

            System.IO.StreamReader sr=new System.IO.StreamReader(fs);

            n = Convert.ToInt32(sr.ReadLine());

            for (i = 0; i < n; i++)

            {

                st = sr.ReadLine();

                st2 = st.Split(' ');

                for (j = 0; j <= n; j++)

                    a[i, j] = Convert.ToDouble(st2[j]);

            }

            sr.Close(); fs.Close();

            for (k = 0; k < n – 1; k++)

            {

                //选主元

                r = k;

                for (i=k;i<n;i++)

                    if (Math.Abs(a[i,k])>Math.Abs(a[r,k])) r=i;

                if (Math.Abs(a[r, k]) < 1e-6)

                {

                    Console.WriteLine("消元失败。");

                    Console.ReadKey();

                    return;

                }

                if (r > k)//非本行,交换主元

                {

                    for (j = k; j <= n; j++)

                    {

                        c = a[k, j]; a[k, j] = a[r, j]; a[r, j] = c;

                    }

                }

                for (i = k + 1; i < n; i++)

                {

                    a[i, k] /= a[k, k];

                    for (j = k + 1; j <= n; j++)

                        a[i, j] -= a[i, k] * a[k, j];

                }

            }

            a[n – 1, n] /= a[n – 1, n – 1];

            for (k = n – 2; k >= 0; k–)

            {

                c = 0;

                for (j = k + 1; j <= n; j++)

                    c += a[k, j] * a[j, n];

                a[k, n] = (a[k, n] – c) / a[k, k];

            }

            for (k = 0; k < n; k++)

            {

                Console.Write(a[k, n].ToString() + " , ");

            }

            Console.ReadKey();

        }

[/code]

一条评论

发表评论

电子邮件地址不会被公开。