解方程组之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
请按任意键继续. . .