C#--Gauss消元之完全主元法

Gauss完全主元法

在k次消元的基础上加了换列操作,其他都一样。
主要部分换行换列;
public double  Findikjk(int k, ref int ik, ref int jk)
        {
            double max = 0;
            ik = 0; jk = 0;
            for (int i = k; i < n; i++)
            {
                for (int j = k; j < n; j++)
                {
                    if (Math.Abs(A[i, j]) > max)
                    {
                        max = Math.Abs(A[i, j]);
                        ik = i; jk = j;
                    }
                }
            }
            return max;
        }
        public void Exchangi(int k,int ik)
        {
            if ( k!= ik) //换行
            {
                for (int j = k; j < n + 1; j++)
                {
                    double t = a[k, j];
                    a[k, j] = a[ik, j];
                    a[ik, j] = t;
                }
            }
            else return;
        }

        public void Exchangj(int k,int jk)
        {
            if (k != jk) //换列
            {
                for (int i = k; i < n; i++)
                {
                    double t = a[i, k];
                    a[i, k] = a[i, jk];
                    a[i, jk] = t;
                }
                int r = z[k];
                z[k] = z[jk];
                z[jk] = r;
                Console.WriteLine("---第{0}列和第{1}列交换----", k, jk);
            }
            else return;
        }

完整部分:

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

namespace Guass3
{
    public class Guass3
    {
        int[] z;
        private int n;
        public int N
        {
            get { return n; }
            set { n = value; }
        }
        private double[,] a;
        public double[,] A
        {
            get { return a; }
            set { a = value; }
        }
        private double[] x;
        public double[] X
        {
            get { return x; }
            set { x = value; }
        }

        //构造函数
        public void Input()
        {

            Console.WriteLine("请输入阶数:");
            n = Convert.ToInt32(Console.ReadLine());
            a = new double[n, n + 1];
            x = new double[n];
            z = new int[n + 1];
            Console.WriteLine("请输入各行系数:");
            for (int i = 0; i < n; i++)
            {
                string s = Console.ReadLine();
                string[] ss = s.Split(' ', ',');
                for (int j = 0; j < n + 1; j++)
                {
                    a[i, j] = Convert.ToDouble(ss[j]);
                }
            }
        }

        public double  Findikjk(int k, ref int ik, ref int jk)
        {
            double max = 0;
            ik = 0; jk = 0;
            for (int i = k; i < n; i++)
            {
                for (int j = k; j < n; j++)
                {
                    if (Math.Abs(A[i, j]) > max)
                    {
                        max = Math.Abs(A[i, j]);
                        ik = i; jk = j;
                    }
                }
            }
            return max;
        }
        public void Exchangi(int k,int ik)
        {
            if ( k!= ik) //换行
            {
                for (int j = k; j < n + 1; j++)
                {
                    double t = a[k, j];
                    a[k, j] = a[ik, j];
                    a[ik, j] = t;
                }
            }
            else return;
        }

        public void Exchangj(int k,int jk)
        {
            if (k != jk) //换列
            {
                for (int i = k; i < n; i++)
                {
                    double t = a[i, k];
                    a[i, k] = a[i, jk];
                    a[i, jk] = t;
                }
                int r = z[k];
                z[k] = z[jk];
                z[jk] = r;
                Console.WriteLine("---第{0}列和第{1}列交换----", k, jk);
            }
            else return;
        }
        
        public void Xiaoyuan3()
        {
            double max;
            int ik = 0, jk = 0;
            z = new int[n];
            for (int i=0;i<n;i++)
            {
                z[i] = i;
            }
            for (int k = 0; k < n - 1; k++)
            {
                max = Findikjk(k, ref ik, ref jk);
                if (max == 0) return;
                Exchangi(k, ik);
                Exchangj(k, jk);
                for (int i = k + 1; i < n; i++)
                {
                    double suma = 0; 
                    suma+= a[i, k] / a[k, k];
                    for (int j = k; j < n + 1; j++)
                        a[i, j] = a[i, j] - suma * a[k, j];
                }
                Console.WriteLine("\n第{0}次消元,系数为:", k + 1);
                for (int i = 0; i < n; i++)
                {
                    string s = null;
                    for (int j = 0; j < n + 1; j++)
                    {
                        s += string.Format("{0,8:f2}", a[i, j]);
                    }
                    Console.WriteLine(s);
                }
            }
        }
        public void Huidai3()
        {
            for (int i = n - 1; i >= 0; i--)
            {
                double sum = 0;
                for (int j = i + 1; j < n; j++)
                {
                    sum+= a[i, j] * x[z[j]];
                }
                x[z[i]] = (a[i, n] - sum) / a[i, i];
            }
            Console.WriteLine("方程组的解为:");
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine("x{0}={1,6:f2};", i + 1, x[z[i]]);
            }
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Guass3 abc = new Guass3();
            abc.Input();
            abc.Xiaoyuan3();
            abc.Huidai3();
        }
    }
}

最终结果:
谢谢!!

猜你喜欢

转载自blog.csdn.net/qq_40953393/article/details/80200997
今日推荐