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(); } } }
最终结果:
谢谢!!