Gauss消元之第k次消元法
主要步骤:
1,判断|a[i,k]|=Max|a[i,k]|!=0 (k<=i<=n)
2.如果ir!=k,矩阵进行行交换;ir行和k行交换;
3,进行消元,消元方法和Gauss直接消元法一样;(不知道的可以看关于Gauss直接消元法的文章)
核心部分换行:
public void Exchang()
{
double max = 0;
int ik = 0;
for (int k = 0; k < n - 1; k++)
{
for (int i = k; i < n; i++)
{
if (Math.Abs(a[i, k]) > max)
{
max = Math.Abs(a[i, k]);
ik = i;
if (ik != k) //换行
{
for (int j = k; j < n + 1; j++)
{
double t = a[k, j];
a[k, j] = a[ik, j];
a[ik, j] = t;
}
}
else break;
}
}
}
}
完整部分:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guass2
{
public class Guass2
{
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];
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 void Exchang()
{
double max = 0;
int ik = 0;
for (int k = 0; k < n - 1; k++)
{
for (int i = k; i < n; i++)
{
if (Math.Abs(a[i, k]) > max)
{
max = Math.Abs(a[i, k]);
ik = i;
if (ik != k) //换行
{
for (int j = k; j < n + 1; j++)
{
double t = a[k, j];
a[k, j] = a[ik, j];
a[ik, j] = t;
}
}
else break;
}
}
}
}
public void Xiaoyuan1()
{
for (int k = 0; k < n - 1; k++)
{
Exchang();
for (int i=k+1;i<n;i++)
{
double 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 huidai()
{
for (int i=n-1;i>=0;i--)
{
double sum = 0;
for (int j=i+1;j<n;j++)
{
sum = a[i, j] * x[j];
}
x[i] = (a[i, n] - sum) / a[i, i];
}
Console.WriteLine("方程组的解为:");
for (int i=0;i<n;i++)
{
Console.WriteLine("x{0}={1,4:f2};", i + 1, x[i]);
}
}
}
class Program
{
static void Main(string[] args)
{
Guass2 abc = new Guass2 ();
abc.Input();
abc.Xiaoyuan1();
abc.huidai();
}
}
}
结果: