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