//c++实现雅克比迭代式
#include<iostream>
#include<iomanip>
#include<string>
#include<vector>
using namespace std;

//函数求数组中的最大值
double MaxOfList(vector<double>x) {
	double max = x[0];
	int n = x.size();
	for (int i = 0; i < n; i++)
		if (x[i] > max) max = x[i];
	return max;
}

//雅可比迭代公式
void Jacobi(vector<vector<double> > A, vector<double> B, int n) {
	vector<double> X(n, 0);	//相当于一个初始向量取x0(0,0,0,0)
	vector<double> Y(n, 0);	//存放新的未知数值
	vector<double> D(n, 0);	//用来存放每未知数迭代前和迭代后的差值。
	int k = 0; //记录循环次数
	do {
		X = Y;//将迭代后的y赋值给x来处理新的。
		for (int i = 0; i < n; i++) {
			double tem = 0;
			for (int j = 0; j < n; j++) {
				if (i != j) tem += A[i][j] * X[j];//除了系数本身的上一个,加上其它系数对应乘上上一个嵌套并相加
			}
			Y[i] = (B[i] - tem) / A[i][i];//再用常数项来减去除了本身系数的每一个其它未知数乘以系数最后除以本未知数对应的系数
			cout << left << setw(8) << Y[i] << " ";//输出当前未知数对应的值,从x1开始。
		}
		cout << endl;
		k++;
		if (k > 100) {	//迭代了再多次也达不到趋近的范围值
			cout << "迭代失败!(可能是函数不收敛)" << endl;
			return;
		}

		for (int a = 0; a < n; a++) {
			D[a] = X[a] - Y[a];	//用来存储每次的后值减去前值的差值来用作判断,每次迭代都会重新赋值。
		}
	} while (MaxOfList(D) > 0.00001 || MaxOfList(D) < -0.00001);	//使用e来作为趋近的范围判定。

	return;
}

int main_yakebi() {
	int n;
	cout << "请输入方程组未知数的个数n:";
	cin >> n;
	cout << endl;
	vector<vector<double>>A(n, vector<double>(n, 0));//相当于创建一个二维数组A[n][n],数组的每个数初值为0
	vector<double>B(n, 0);//同上只是把二维数组改为一位数组。
	cout << "请输入方程组的系数矩阵:" << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> A[i][j];	//由二维数组来存储方程式的系数
		}
	}
	cout << endl;
	cout << "请输入方程组的值向量:" << endl;
	for (int k = 0; k < n; k++) {
		cin >> B[k];	//一位数组来存储这个值
	}
	cout << endl;
	cout << "您输入的方程组为:" << endl;
	for (int a = 0; a < n; a++) {
		for (int b = 0; b < n; b++) {
			cout << A[a][b] << " ";	//二次循环访问系数矩阵
		}
		cout << "    " << B[a] << endl;//用行数来处理常数向量
	}
	cout << endl;
	cout << "由雅可比迭代公式求的方程组的解为:" << endl;//这里开始调用雅克比迭代方程式
	Jacobi(A, B, n);
	return 0;
}//c++实现雅克比迭代式
#include<iostream>
#include<iomanip>
#include<string>
#include<vector>
using namespace std;

//函数求数组中的最大值
double MaxOfList(vector<double>x) {
	double max = x[0];
	int n = x.size();
	for (int i = 0; i < n; i++)
		if (x[i] > max) max = x[i];
	return max;
}

//雅可比迭代公式
void Jacobi(vector<vector<double> > A, vector<double> B, int n) {
	vector<double> X(n, 0);	//相当于一个初始向量取x0(0,0,0,0)
	vector<double> Y(n, 0);	//存放新的未知数值
	vector<double> D(n, 0);	//用来存放每未知数迭代前和迭代后的差值。
	int k = 0; //记录循环次数
	do {
		X = Y;//将迭代后的y赋值给x来处理新的。
		for (int i = 0; i < n; i++) {
			double tem = 0;
			for (int j = 0; j < n; j++) {
				if (i != j) tem += A[i][j] * X[j];//除了系数本身的上一个,加上其它系数对应乘上上一个嵌套并相加
			}
			Y[i] = (B[i] - tem) / A[i][i];//再用常数项来减去除了本身系数的每一个其它未知数乘以系数最后除以本未知数对应的系数
			cout << left << setw(8) << Y[i] << " ";//输出当前未知数对应的值,从x1开始。
		}
		cout << endl;
		k++;
		if (k > 100) {	//迭代了再多次也达不到趋近的范围值
			cout << "迭代失败!(可能是函数不收敛)" << endl;
			return;
		}

		for (int a = 0; a < n; a++) {
			D[a] = X[a] - Y[a];	//用来存储每次的后值减去前值的差值来用作判断,每次迭代都会重新赋值。
		}
	} while (MaxOfList(D) > 0.00001 || MaxOfList(D) < -0.00001);	//使用e来作为趋近的范围判定。

	return;
}

int main_yakebi() {
	int n;
	cout << "请输入方程组未知数的个数n:";
	cin >> n;
	cout << endl;
	vector<vector<double>>A(n, vector<double>(n, 0));//相当于创建一个二维数组A[n][n],数组的每个数初值为0
	vector<double>B(n, 0);//同上只是把二维数组改为一位数组。
	cout << "请输入方程组的系数矩阵:" << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> A[i][j];	//由二维数组来存储方程式的系数
		}
	}
	cout << endl;
	cout << "请输入方程组的值向量:" << endl;
	for (int k = 0; k < n; k++) {
		cin >> B[k];	//一位数组来存储这个值
	}
	cout << endl;
	cout << "您输入的方程组为:" << endl;
	for (int a = 0; a < n; a++) {
		for (int b = 0; b < n; b++) {
			cout << A[a][b] << " ";	//二次循环访问系数矩阵
		}
		cout << "    " << B[a] << endl;//用行数来处理常数向量
	}
	cout << endl;
	cout << "由雅可比迭代公式求的方程组的解为:" << endl;//这里开始调用雅克比迭代方程式
	Jacobi(A, B, n);
	return 0;
}