日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高斯赛德尔迭代法

發布時間:2024/7/23 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高斯赛德尔迭代法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們在求解矩陣時,有很多種方法,其中當矩陣是大型稀疏矩陣(矩陣中有大部分元素都為0)時,我們可以用迭代法求解。
關于該方法的思想和定義,請參考如下博客:
http://www.doc88.com/p-6953977164202.html
我編寫的C++代碼,也是根據上面的博客中的數學公式。
在這里我們使用的數據文件matrix.txt為
- 第一行表示矩陣的行數或者列數
- 接下來的三行,表示矩陣本體 A
- 最后一行表示 b,A*x=b
- 我們要計算的就是x

3 8 -3 2 4 11 -1 6 3 12 20 33 36

代碼如下:

#include <iostream> #include <fstream> #include <vector> #include <opencv2/opencv.hpp> #include <opencv2/photo.hpp>using namespace std; using namespace cv;int main() {ifstream file("matrix.txt");int rows;int cols;file >> rows;cols = rows;Mat A(rows, cols, CV_32FC1);/*我們假設輸入的矩陣對角線元素不為0*/for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){file >> A.at<float>(i, j);}}Mat b(1, cols, CV_32FC1);for (int i = 0; i < cols; i++){file >> b.at<float>(i);}file.close();//迭代次數 iter = 10次Mat x(1, cols, CV_32FC1);x.setTo(0);for (int iter = 0; iter < 10; iter++){for (int i = 0; i < rows; i++){float sum = 0;for (int j = 0; j < cols; j++){if (i == j)continue;sum += A.at<float>(i, j)*x.at<float>(j);}x.at<float>(i) = (b.at<float>(i) -sum) / A.at<float>(i, i);}}cout << "最終的結果為:" << endl;for (int i = 0; i < cols; i++){cout << "x" << i << "=" << x.at<float>(i) << "\t";}return 0; }

最后輸出的結果為

最終結果為 x0=3 x1=2 x2=1

和正確的結果一樣。在這里我們迭代了10次,求出了最終的結果。關于數值分析,我并沒有投入太多的精力,如果有問題和值得改進的地方,希望各位留言。

總結

以上是生活随笔為你收集整理的高斯赛德尔迭代法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。