其實迭代法前面已經學習過啦,這裡的迭代是在前面迭代的基礎上的高階形式——即解決線性方程組的問題。
下面簡單介紹雅克比迭代的基本流程。
有一線性方程組,ax=
bax=b
ax=b
,其中:
我們可以將其化為以下形式:
x i=
bxj+
f,(i
=1,2
,3......n,
j=1,
2,3,
¬i..
...n
)x_i=bx_j+f,(i=1,2,3......n,j=1,2,3,\lnot i.....n)
xi=bx
j+f
,(i=
1,2,
3...
...n
,j=1
,2,3
,¬i.
....
n)則迭代形式可化為:
x i=
bxi+
1+fx^=bx^+f
xi=bxi
+1+f
j ac
obijacobi
jacobi
迭代法的流程是:
若係數矩陣a
aa是非奇異矩陣且aii
̸≠0a_\not\ne0
aii
=0
,則可以將a
aa**成:
a =d
+l+u
a=d+l+u
a=d+l+
u其中d
dd為對角矩陣,l
ll為下三角矩陣,u
uu為上三角矩陣
則迭代公式可以轉換為:
x i=
−d−1
(l+u
)xi+
1+fx^=-d^(l+u)x^+f
xi=−d−
1(l+
u)xi
+1+f
整理得:
具此求解.
在雅可比迭代的流程中我們不難發現
前一步計算出來的xik
+1x^_i
xik+1
在下一步中並沒有利用到,而新計算出來的值必定比前置更為精確,故為了使計算更為精確,我們將下一步中的xik
x^k_i
xik
替換為上一步中計算出來的xik
+1x^_i
xik+1
進行計算,這種演算法就叫做高斯-賽德爾迭代(gauss-seidel)
化簡得到:
雅可比迭代:
#include
using
namespace std;
typedef pair<
int,
int> pii;
#define int long long
const
int n =
1e3+10;
double a[n]
[n], b[n]
, x[n]
;int n;
void
jacobi()
x2[i]
=(b[i]
- cnt)
/ a[i]
[i];
}for
(int i=
0; i < n; i++
) x[i]
=x2[i];}
for(
int i =
0; i < n; i++
)printf
("x[%d]=%lf%c"
, i +
1, x2[i]
, i == n -1?
'\n'
:' ');
}signed
main()
高斯賽德爾迭代:
#include
using
namespace std;
typedef pair<
int,
int> pii;
#define int long long
const
int n =
1e3+10;
double a[n]
[n], b[n]
, x[n]
;int n;
void
gauss_seidel()
x[i]
=(b[i]
- cnt)
/ a[i]
[i];}}
for(
int i =
0; i < n; i++
)printf
("x[%d]=%lf%c"
, i +
1, x[i]
, i == n -1?
'\n'
:' ');
}signed
main()
雅可比迭代:
在這裡插入**片
高斯-賽德爾迭代:
在這裡插入**片
計算機數值方法之代數插值C語言
使用拉格朗日插值法或牛頓插值法求解 已知f x 在6個點的函式值如下表所示,運用插值方法,求f 0.596 的近似值。拉格朗日插值法比牛頓插值法易理解,但是運算速度慢,程式繁多,而且如果是不斷插如新資料,拉格朗日需要重新算一遍,而牛頓插值法則不需要,牛頓插值法唯一需要注意的是發現對角線元素為差商,用...
計算機運算方法和運算部件
整數十進位制轉二進位制有模2取餘法。小數轉二進位制有乘2取整法。二進位制轉十六進製制 二進位制從低位到高位四個為一組 高位不夠補0 轉換為十六進製制。反之為十六進製制轉換二進位制。十進位制轉十六進製制 第一種先把十六進製制轉換為二進位制,再把二進位制轉換為十六進製制。第二種模16取餘法,十六進製制即...
計算機檢查漏洞方法和相應處理
近來 事件頻頻發生,我們身邊的朋友可能有qq e mail和遊戲賬號被盜事件發生。現在的 技術有朝著大眾化方向發展的趨勢,能夠掌握 他人系統技術的人越來越多了,只要你的電腦稍微有點系統bug或者安裝了有問題的應用程式,就有可能成為他人的肉雞。如何給一台上網的機器查漏洞並做出相應的處理呢?一 要命的埠...