//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;
}