首页 > 编程语言 >#SOR-序列超松弛算法

#SOR-序列超松弛算法

时间:2024-03-02 22:11:42浏览次数:18  
标签:松弛 int max 算法 SOR np new omega

\(\textbf{SOR(Successive Over-Relaxation)}\)算法是一种用于解线性方程组的迭代方法,它通过引入松弛因子来加快收敛速度。SOR算法的基本步骤如下:

  1. 将系数矩阵\(A\)分解为\(A=D-L-U\),其中D是A的对角线元素构成的对角矩阵,\(L\)是\(A\)的下三角部分(不含对角线)构成的矩阵,\(U\)是\(A\)的上三角部分(不含对角线)构成的矩阵。

  2. 选择一个适当的松弛因子\(ω\)(通常在\(0\)和\(2\)之间),并且假设初始解向量\(x^{(0)}\)。

  3. 对于\(k=0,1,2,...\)进行下面的迭代步骤:

    • 对于\(i=1,2,...,n\),计算新的解向量中的第i个分量:

      \[x_i^{(k+1)} = (1-\omega)x_i^{(k)} + \left(\frac{\omega}{a_{ii}}\right) \left(b_i - \sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)} - \sum_{j=i+1}^{n}a_{ij}x_j^{(k)}\right) \]

  4. 重复步骤3直到满足收敛条件。

SOR算法的优点是相对于\(\textbf{Jacobi或Gauss-Seidel}\)方法,可以更快地收敛到解。然而,选择合适的松弛因子是很关键的,不同的问题可能需要不同的松弛因子才能获得最佳的收敛效果。

c++实现:


#include <bits/stdc++.h>
using namespace std;

vector<double> SOR(vector<vector<double>> A, vector<double> b, double omega, double tol, int max_iter) {
    int n = A.size();
    vector<double> x(n, 0.0); // 初始化解向量
    vector<double> x_new(n, 0.0); // 用于存储新的解向量

    for (int k = 0; k < max_iter; ++k) {
        for (int i = 0; i < n; ++i) {
            double sigma1 = 0.0, sigma2 = 0.0;
            for (int j = 0; j < i; ++j) {
                sigma1 += A[i][j] * x_new[j];
            }
            for (int j = i + 1; j < n; ++j) {
                sigma2 += A[i][j] * x[j];
            }
            x_new[i] = (1 - omega) * x[i] + (omega / A[i][i]) * (b[i] - sigma1 - sigma2);
        }
        // 检查收敛性
        double max_diff = 0.0;
        for (int i = 0; i < n; ++i) {
            max_diff = max(max_diff, abs(x_new[i] - x[i]));
        }
        if (max_diff < tol) {
            return x_new;
        }
        x = x_new;
    }
    return x; // 返回最后的解向量
}

int main() {
    vector<vector<double>> A = {{4, 1, 1}, {1, 3, 2}, {1, 2, 5}};
    vector<double> b = {12, 13, 14};
    double omega = 1.25;
    double tol = 1e-5;
    int max_iter = 100;

    vector<double> x = SOR(A, b, omega, tol, max_iter);

    for (int i = 0; i < x.size(); ++i) {
        cout << "x[" << i << "] = " << x[i] << endl;
    }

    return 0;
}

python实现:


import numpy as np

def SOR(A, b, omega, tol, max_iter):
    n = len(A)
    x = np.zeros(n) # 初始化解向量

    for k in range(max_iter):
        x_new = np.copy(x)
        for i in range(n):
            sigma1 = np.dot(A[i, :i], x_new[:i])
            sigma2 = np.dot(A[i, i+1:], x[i+1:])
            x_new[i] = (1 - omega) * x[i] + (omega / A[i, i]) * (b[i] - sigma1 - sigma2)
        # 检查收敛性
        if np.max(np.abs(x_new - x)) < tol:
            return x_new
        x = x_new
    return x # 返回最后的解向量

A = np.array([[4, 1, 1], [1, 3, 2], [1, 2, 5]])
b = np.array([12, 13, 14])
omega = 1.25
tol = 1e-5
max_iter = 100

x = SOR(A, b, omega, tol, max_iter)

for i in range(len(x)):
    print(f"x[{i}] = {x[i]}")

标签:松弛,int,max,算法,SOR,np,new,omega
From: https://www.cnblogs.com/rexaron/p/18049359

相关文章

  • 基于四叉树的图像分割算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述        图像分割是计算机视觉和图像处理中的一项关键技术,旨在将图像划分为多个具有相似性质的区域。基于四叉树的图像分割算法是一种有效的分割方法,它通过递归地将图像划分为四个子......
  • 高级搜索算法学习笔记
    0.前言如有错误,欢迎各位大佬指出。前置芝士:深度优先搜索广度优先搜索1.何为高级搜索?在通常情况下,普通的深搜往往会超时,即使剪枝也无动于衷。对于广搜,我们一旦超时也很难进行优化。而这时,我们就需要对搜索的形态进行改变,将深搜和广搜进行升级,变形成为各种效率更高的高......
  • 代码随想录算法训练营第三十四天| ● 860.柠檬水找零 ● 406.根据身高重建队列 ●
    柠檬水找零 题目链接:860.柠檬水找零-力扣(LeetCode)思路:注意对于20元的情况,有两种找零方式,            头一次见到这种情况,随便加一个标准输出才能通过的样例。classSolution{public:boollemonadeChange(vector<int>&bills){in......
  • 代码随想录算法训练营day11 | leetcode 20. 有效的括号、1047. 删除字符串中的所有相
    目录题目链接:20.有效的括号-简单题目链接:1047.删除字符串中的所有相邻重复项-简单题目链接:150.逆波兰表达式求值-中等题目链接:20.有效的括号-简单题目描述:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右......
  • 算法工程师面试常考手撕题
    手撕numpy写线性回归的随机梯度下降(stochasticgradientdescent,SGD)  在每次更新时用1个样本,可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,对于最优化问题,凸问......
  • 代码随想录 第九天 | 烤馍片(kmp)算法 ●28. 实现 strStr() ●459.重复的子字符串
    烤馍片算法(kmp):为了不让遍历的指针回退,每次不相等的时候找不相等之前的字符串的最长相等前后缀。i表示目标字符串,j表示需要在目标找到的字符串的指针。最长相等前后缀的长度就是之前有多少个与needle字符串相同,直接将j跳到上一元素位置记录的最长相等前后缀长度(next数组),这样i就可以......
  • 代码随想录算法训练营第三十三天 | 135. 分发糖果, 134. 加油站, 1005.K次取反后最大化
      1005.K次取反后最大化的数组和 已解答简单 相关标签相关企业 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下......
  • day51 动态规划part8 代码随想录算法训练营 139. 单词拆分
    题目:139.单词拆分我的感悟:背包最后一part,不错!!这题不好,不写了。理解难点:状态转移方程如何写听课笔记:首次代码及思考过程:classSolution:defwordBreak(self,s:str,wordDict:List[str])->bool:#可以用多次-->完全背包#物品是worDict集......
  • 智能分析网关V4安全帽检测/反光衣检测/通用工服检测算法及应用
    TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入,可兼容市面上常见的厂家品牌设备,可兼容IPC、网络音柱等,同时也支持智......
  • 代码随想录算法训练营第三十三天| ● 1005.K次取反后最大化的数组和 ● 134. 加油站
    K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和-力扣(LeetCode)思路:首先增序排序,然后依次将负值取反,如果负数先用完,则再排序一次,将最小的正数取反之后求和;如果k先用完,直接求和。注意sort默认是增序排序,若想要要降序,则不能使用sort(nums.end(),nums.begin())......