引言
SOR(Successive Over-Relaxation)迭代法是一種改進的Gauss-Seidel方法,經由過程調劑鬆弛因子w來減速收斂速度。在科學打算跟工程範疇中,線性方程組的求解是一個罕見成績,SOR迭代法因其高效的收斂性而被廣泛利用。本文將具體介紹SOR迭代算法的道理,並供給C言語編程實戰指南。
SOR迭代算法道理
SOR迭代法的基本頭腦是在Gauss-Seidel迭代的基本上引入鬆弛因子w,以改良迭代過程的收斂性。對線性方程組Ax=b,SOR迭代法的基本步調如下:
- 初始化:設定初始解向量x0,偏差閾值tolerance,最大年夜迭代次數maxiter,鬆弛因子w(平日取1到2之間的值)。
- 迭代打算:重複以下步調直到滿意收斂前提:
- 打算鬆弛迭代:
x_{i+1} = (1-w) * x_i + w * (b - A * x_i) / A_{ii}
- 更新解向量x。
- 打算鬆弛迭代:
- 檢查收斂性:假如以後解向量x與上一次迭代解向量x_i的偏差小於閾值tolerance,則認為已收斂;不然,持續迭代。
C言語編程實戰指南
以下是一個利用C言語實現的SOR迭代法示例順序:
#include <stdio.h>
#include <math.h>
#define MAXITER 1000
#define EPSILON 1e-6
void sor(double A[][3], double b[], double x[], int n, double w) {
double temp[3];
int i, j, iter;
for (iter = 0; iter < MAXITER; iter++) {
for (i = 0; i < n; i++) {
temp[i] = (1 - w) * x[i];
for (j = 0; j < n; j++) {
if (i != j) {
temp[i] += w * (A[i][j] * x[j]);
}
}
temp[i] += w * (b[i] / A[i][i]);
if (fabs(temp[i] - x[i]) > EPSILON) {
x[i] = temp[i];
}
}
if (fabs(temp[0] - x[0]) < EPSILON && fabs(temp[1] - x[1]) < EPSILON && fabs(temp[2] - x[2]) < EPSILON) {
break;
}
}
}
int main() {
double A[3][3] = {{1.1, 0.0, 0.0}, {0.0, 1.1, 0.0}, {0.0, 0.0, 1.1}};
double b[3] = {0.5, 0.5, 0.5};
double x[3] = {0.0, 0.0, 0.0};
double w = 1.25; // 鬆弛因子
sor(A, b, x, 3, w);
printf("Solution:\n");
for (int i = 0; i < 3; i++) {
printf("x[%d] = %f\n", i, x[i]);
}
return 0;
}
在上述順序中,我們定義了一個3x3的係數矩陣A,一個常數向量b,以及一個初始解向量x。鬆弛因子w取1.25。經由過程挪用sor
函數,我們可能打算出方程組的解向量x。
總結
經由過程本文,我們懂得了SOR迭代算法的道理跟C言語編程實戰指南。在現實利用中,可能根據具體成績調劑鬆弛因子w跟偏差閾值tolerance,以進步算法的收斂速度跟精度。