一、目的
1、掌握Gauss-Seidel迭代基础原理
2、掌握Gauss-Seidel迭代解方程组的步骤
3、能用程序语言对Gauss-Seidel迭代进行编程实现
二、代码
1、GaussBase.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GaussSeide
{
class Gauss
{
public double[,] a;
public double[] x;
public double e = 10e-4;
protected double[] x2;
public double[] X2
{
get { return x2; }
set { x2 = value; }
}
public int n;
public int N
{
get { return n; }
set { n = value; }
}
public double[,] A
{
get { return a; }
set { a = value; }
}
public double[] X
{
get { return x; }
set { x = value; }
}
public virtual void Input()
{
Console.WriteLine("请输入方程的阶数:");
n = int.Parse(Console.ReadLine());
a = new double[n + 1, n + 2];
x = new double[n + 1];
Console.WriteLine("请输入方程的系数:");
for (int i = 1; i <= n; i++)
{
string s = Console.ReadLine();
string[] s2 = s.Split(' ');
for (int j = 1; j <= n + 1; j++)
{
a[i, j] = double.Parse(s2[j - 1]);
}
}
}
public virtual void CalcuA()
{
for (int k = 1; k <= n - 1; k++)
{
for (int i = k + 1; i <= n; i++)
{
double lik = a[i, k] / a[k, k];
for (int j = k + 1; j <= n + 1; j++)
{
a[i, j] = a[i, j] - lik * a[k, j];
}
a[i, k] = 0;
}
Console.WriteLine("---第{0}消元----", k + 1);
OutputA();
}
Console.WriteLine("---消元完成----");
}
public void OutputA()
{
Console.WriteLine("---------A[i,j]----------");
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n + 1; j++)
{
Console.Write("{0,8:F2}", a[i, j]);
}
Console.WriteLine();
}
}
public virtual void CalcuX()
{
x = new double[n + 1];
Console.WriteLine("----------正在计算回代过程-----------");
for (int i = n; i >= 1; i--)
{
double sum = 0;
for (int j = i + 1; j <= n; j++)
{
sum += a[i, j] * x[j];
}
x[i] = (a[i, n + 1] - sum) / a[i, i];
}
Console.WriteLine("----------回代过程计算结束-----------");
}
public void Output()
{
Console.WriteLine("方程组的解为:");
for (int i = 1; i <= n; i++)
{
Console.WriteLine("x{0}={1,6:F6};", i, x[i]);
}
}
public virtual void Calcu()
{
Input();
OutputA();
CalcuA();
CalcuX();
Output();
}
}
}
2、GaussSeide.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GaussSeide
{
class GaussSeide : Gauss
{
public override void Calcu()
{
Input();
OutputA();
int k = 1;
for (; k <= 10000; k++)
{
int count = 0;
for (int i = 1; i <= n; i++)
{
double sum = 0;
for (int j = 1; j <= n; j++)
{
if (j != i)
sum += a[i, j] * x[j];
}
double x0 = x[i];
x[i] = (a[i, n + 1] - sum) / a[i, i];
if (Math.Abs(x[i] - x0) < e)
{
count++;
}
}
if (count == N)
{
Console.WriteLine("迭代次数:{0}", k);
break;
}
}
if (k > 10000)
{
Console.WriteLine("迭代发散");
}
Output();
}
}
}
3、Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GaussSeide
{
class Program
{
static void Main(string[] args)
{
GaussSeide w = new GaussSeide();
w.Calcu();
}
}
}