解方程组之Jacobi法
迭代过程
之后确定迭代格式,X^(k+1) =
B*X^(k) +
f ,(这里^表示的是上标,括号内数字即迭代次数),如图2所示,其中
B称为迭代矩阵,雅克比迭代法中一般记为
J。(k = 0,1,......)
再选取初始迭代
向量X^(0),开始逐次迭代。
核心部分,迭代实现:
public void Calcu5()
{
int count1 = 0, count2 = 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];
}
}
x2[i] = (a[i, n] - sum) / a[i, i];
if (Math.Abs(x2[i] - x[i]) < e)
count2++;
}
count1++;
if(count1>10000)
{ Console.WriteLine("迭代发散!!!");break; }
if(count2==n)
{ Console.WriteLine("迭代次数:{0}", count2);break; }
for(int i=0;i<n;i++)
{ x[i] = x2[i]; }
}
}
完整:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Jacobi迭代
{
class Jacobi
{
int n;
public int N
{
get { return n; }
set { n = value; }
}
double[,] a;
public double[,] A
{
get { return a; }
set { a = value; }
}
double[] x;
public double[] X
{
get { return x; }
set { x = value; }
}
double e = 0.00001;
public double E
{
get { return e; }
set { e = value; }
}
private double[] x2;
public double[] X2
{
get { return x2; }
set { x2 = value; }
}
public void Input()
{
Console.WriteLine("请输入阶数:");
n = Convert.ToInt32(Console.ReadLine());
a = new double[n, n + 1];
x = new double[n];
x2 = new double[N + 1];
for (int i = 0; i < N; i++)
{
X[i] = 0;
}
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 Calcu5()
{
int count1 = 0, count2 = 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];
}
}
x2[i] = (a[i, n] - sum) / a[i, i];
if (Math.Abs(x2[i] - x[i]) < e)
count2++;
}
count1++;
if(count1>10000)
{ Console.WriteLine("迭代发散!!!");break; }
if(count2==n)
{ Console.WriteLine("迭代次数:{0}", count2);break; }
for(int i=0;i<n;i++)
{ x[i] = x2[i]; }
}
}
public void Output()
{
Console.WriteLine("方程系数为:");
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 OutputX()
{
Console.WriteLine("\n方程组的解是:");
for (int i = 0; i < n; i++)
{
Console.WriteLine("x{0}={1}", i + 1, x[i]);
}
}
}
class Program
{
static void Main(string[] args)
{
Jacobi abc = new Jacobi();
abc.Input();
abc.Output();
abc.Calcu5();
abc.OutputX();
}
}
}
运行结果:
请输入阶数:
4
请输入各行系数(','或' '隔开):
10 -1 2 0 6
-1 11 -1 3 25
2 -1 10 -1 -11
0 3 -1 8 15
方程系数为:
10.00 -1.00 2.00 0.00 6.00
-1.00 11.00 -1.00 3.00 25.00
2.00 -1.00 10.00 -1.00 -11.00
0.00 3.00 -1.00 8.00 15.00
迭代发散!!!
4
请输入各行系数(','或' '隔开):
10 -1 2 0 6
-1 11 -1 3 25
2 -1 10 -1 -11
0 3 -1 8 15
方程系数为:
10.00 -1.00 2.00 0.00 6.00
-1.00 11.00 -1.00 3.00 25.00
2.00 -1.00 10.00 -1.00 -11.00
0.00 3.00 -1.00 8.00 15.00
迭代发散!!!
方程组的解是:
x1=1
x2=2
x3=-1
x4=1
请按任意键继续. . .
x1=1
x2=2
x3=-1
x4=1
请按任意键继续. . .