话不多说,上代码
<!--------------------------------------------program放的代码--------------------------------------------------->
class Program
{
static void Main(string[] args)
{
Gauss a = new Jacobi();
a.Do();
}
}
<!--------------------------------------------高斯父类代码———————————————————>
class Gauss
{
protected double[,] a = null;
protected double[] x = null;
protected int n = 0;
public virtual void Do()
{
Input();
OutputA();
if (CalcuA())
{
CalcuX();
OutputX();
}
else
{
Console.WriteLine(" 主对角线出现0数字,无法计算");
}
}
public virtual void Input()
{
Console.WriteLine("请输入阶数n:");
n = Convert.ToInt16(Console.ReadLine());
a = new double[n, n + 1];
x = new double[n];
Console.WriteLine("请输入系数A[i,j]:");
for (int i = 0; i < n; i++)
{
string s = Console.ReadLine();
string[] rs = s.Split(' ');
for (int j = 0; j <= n; j++)
a[i, j] = Convert.ToDouble(rs[j]);
}
}
public void OutputA()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n + 1; j++)
{
Console.Write("{0,10:f2}", a[i, j]);
}
Console.WriteLine();
}
}
public virtual bool CalcuA()
{
for (int k = 0; k < n - 1; k++)
{
for (int i = k + 1; i < n; i++)
{
if (a[k, k] == 0)
return false;
double lik = a[i, k] / a[k, k];
for (int j = k + 1; j < n + 1; j++)
{
a[i, j] = a[i, j] - a[k, j] * lik;
}
a[i, k] = 0;
}
Console.WriteLine("---第{0}消元后---A[i,j]", k);
OutputA();
}
return true;
}
public virtual void CalcuX()
{
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];
}
}
public virtual void OutputX()
{
Console.WriteLine("方程的解是:");
for (int i = 0; i < n; i++)
{
Console.WriteLine("x[{0}]={1,8:f3}", i + 1, x[i]);
}
}
}
<!-------------------------------------------Jacobi子类代码------------------------------------------------------->
class Jacobi:Gauss
{
private double e = 1e-6;
private double[] xx = null;
public double[] XX { get => xx; set => xx = value; }
public override void Input()
{
base.Input();
xx = new double[n];
}
public override void CalcuX()
{
int m = 0;
while (true)
{
for (int i = 0; i <n; i++)
{
double sum = 0;
for (int j = 0; j < n; j++)
{
if(j!=i)
sum += a[i, j] * x[j];
}
xx[i] = (a[i, n] - sum) / a[i, i];
}
Console.WriteLine("当前迭代的次数为{0}-", m);
OutputX();
m++;
int c= 0;
for(int i = 0; i < n; i++)
{
if (Math.Abs(xx[i] - x[i]) < e)
c++;
}
for (int i = 0; i < n; i++)
{
x[i] = xx[i];
}
if (c == n)
{
Console.WriteLine("-迭代的次数{0}-", m);
break;
}
if (m > 100)
break;
}
}
public override void Do()
{
this.Input();
this.OutputA();
this.CalcuX();
this.OutputX();
}
}