迭代法——Matlab中實現
迭代法
這裡一共提供了四種迭代法:
+ 雅可比迭代法
+ 高斯賽德迭代法
+ 超鬆弛迭代法(SOR)
+ 共軛迭代法
隨機生成方程組
此處隨機生成特徵值服從獨立同分布的[0,1]間的均勻分佈的A矩陣,跟服從獨立同分布的正態分佈的b向量
演算法設計
- A矩陣的實現,首先需要用rand得到一組特徵值,將該組特徵值通過diag函式生成對角陣Q,之後通過orth函式生成對稱矩陣U,再通過UQU’即可得到對稱正定矩陣
- b向量的實現同第一題,用randn函式即可
程式碼實現:
%n代表的是維度
b = randn([n(k) 1]);
Q = diag(rand([1 n(k)] ));
U = orth(rand([n(k) n(k)]));
Jacobi 迭代法函式
演算法設計
- 傳入引數為矩陣A,向量b,以及維度n
- 傳出引數為結果與時間(or相對誤差陣列),具體輸出視操作而定
- 通過diag函式,tril函式,triu函式得到A矩陣的對角陣D,上三角矩陣U跟下三角矩陣L
- 通過以下公式得到迭代所需的B跟f
B = D(L+U);
f = D\b;`
- 通過以下公式進行迭代:
x = B*x0 + f;
- 迭代終止的判斷,求出前後兩次迭代的向量差的範數,直至小於1^-6
- 如果迭代次數超過2000,則視為發散,彈出錯誤
程式碼實現:
function [x,y] = Jacobi(n, A ,b)
%y = zeros(1000,1);
eps = 1.0e-6;
D = diag(diag(A));
L = -tril(A, -1);
U = -triu(A, 1);
B = D\(L+U);
f = D\b;
count = 1;
x0 = zeros(n,1);
x = B*x0 + f;
tic;
while norm(x-x0)> eps
x0 = x;
%y(count) = norm(x-A\b);
x = B*x0 + f;
count = count + 1;
if count > 2000
disp('error:該矩陣不收斂');
return;
end
end
toc;
y = toc;
disp(count);
end
Gauss-Seidel 迭代法函式
演算法設計
- 傳入引數為矩陣A,向量b,以及維度n
- 傳出引數為結果與時間(or相對誤差陣列),具體輸出視操作而定
- 通過diag函式,tril函式,triu函式得到A矩陣的對角陣D,上三角矩陣U跟下三角矩陣L
- 通過以下公式得到迭代所需的B跟f
B = (D - L)\U;
f = (D - L)\b;
- 通過以下公式進行迭代:
x = B*x0 + f;
- 迭代終止的判斷,求出前後兩次迭代的向量差的範數,直至小於1^-6
- 如果迭代次數超過2000,則視為發散,彈出錯誤
程式碼實現:
function [x, y]= Gauss_Seidel(n, A ,b)
%y = zeros(1000,1);
eps = 1.0e-6;
D = diag(diag(A));
L = -tril(A, -1);
U = -triu(A, 1);
B = (D - L)\U;
f = (D - L)\b;
count = 1;
x0 = zeros(n,1);
x = B*x0 + f;
tic;
while norm(x-x0) > eps
x0 = x;
% y(count) = norm(x-A\b);
x = B*x0 + f;
count = count + 1;
if count > 2000
disp('error:該矩陣不收斂');
return;
end
end
toc;
y = toc;
disp(count);
end
逐次超鬆弛迭代法函式
演算法設計
- 傳入引數為矩陣A,向量b,以及維度n
- 傳出引數為結果與時間(or相對誤差陣列),具體輸出視操作而定
- 通過diag函式,tril函式,triu函式得到A矩陣的對角陣D,上三角矩陣U跟下三角矩陣L
- 通過以下公式得到迭代所需的B跟f
B = (D - w*L) \ ((1-w) * D + w*U);
f = w * inv(D - w*L) * b;
- 通過以下公式進行迭代:
x = B*x0 + f;
- 迭代終止的判斷,求出前後兩次迭代的向量差的範數,直至小於1^-6
- 如果迭代次數超過2000,則視為發散,彈出錯誤
程式碼實現:
function [x, y] = SOR(n, A ,b, w)
y = zeros(1000,1);
eps = 1.0e-6;
D = diag(diag(A));
L = -tril(A, -1);
U = -triu(A, 1);
B = (D - w*L) \ ((1-w) * D + w*U);
f = w * inv(D - w*L) * b;
count = 1;
x0 = zeros(n,1);
x = B*x0 + f;
tic;
while norm(x-x0) > eps
x0 = x;
y(count) = norm(x-A\b);
x = B*x0 + f;
count = count + 1;
if count > 2000
disp('error:該矩陣不收斂');
return;
end
end
toc;
y = toc;
disp(count);
end
共軛梯度法函式
演算法設計
- 傳入引數為矩陣A,向量b,以及維度n
- 傳出引數為結果與時間(or相對誤差陣列),具體輸出視操作而定
- 通過以下公式得到迭代所需的r0跟p0
r0 = b - A * x0;
p0 = r0;
- 通過以下公式進行迭代:
a = r0'r0/(p0'A*p0);
x = x0 + a*p0;
r = r0 - a*A*p0;
B = r'*r/(r0'*r0);
p = r + B*p0;
- 迭代終止的判斷,求出前後兩次迭代的向量差的範數,直至小於1^-6
- 如果迭代次數超過2000,則視為發散,彈出錯誤
程式碼實現:
function [x, y] = CG(n, A , b)
y = zeros(1000,1);
eps = 1.0e-6;
x0 = zeros(n,1);
r0 = b - A * x0;
p0 = r0;
count = 1;
tic;
while norm(p0) > eps
a = r0'*r0/(p0'*A*p0);
x = x0 + a*p0;
r = r0 - a*A*p0;
B = r'*r/(r0'*r0);
p = r + B*p0;
p0 = p;
r0 = r;
x0 = x;
% y(count) = norm(x-A\b);
count = count + 1;
if count > 2000
disp('error:該矩陣不收斂');
return;
end
end
toc;
y = toc;
disp(count);
end
相對誤差計算
演算法設計
- 通過A\b得到近似解
- 通過求出近似解與得到的解的差向量的範數作為相對誤差
程式碼實現
具體的程式碼實現,已經穿插在四種迭代法中
相關推薦
迭代法——Matlab中實現
迭代法 這裡一共提供了四種迭代法: + 雅可比迭代法 + 高斯賽德迭代法 + 超鬆弛迭代法(SOR) + 共軛迭代法 隨機生成方程組 此處隨機生成特徵值服從獨立同分布的[0,1]間的均勻分佈的A矩陣,跟服從獨立同分布的正態分佈的b向量 演算法
雅可比(jacobi)迭代法 matlab實現
clc clear n = input('請輸入矩陣階數:\n'); for i = 1:n fprintf('請輸入矩陣第%d行\n',i); A(i,:) = input('');
Guass-seidel 迭代法 matlab實現
clc clear n = input('請輸入矩陣階數:\n'); for i = 1:n fprintf('請輸入矩陣第%d行\n',i); A(i,:) = input('');
高斯-賽德爾(guass-seidel)迭代法 C語言實現
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #in
牛頓迭代法解非線性方程matlab實現
1.功能本程式採用牛頓法,求實係數高次代數方程f(x)=a0xn+a1xn-1+…+an-1x+an=0 (an≠0)(1)的在初始值x0附近的一個根。2.使用說明(1)函式語句Y=NEWTON_1(A,N,X0,NN,EPS1) 呼叫M檔案newton_1.m。(2)引數
數值分析 Gauss-Seidel迭代法求解線性方程組 MATLAB程式實現
Gauss-Seidel迭代法 參考數值分析第四版 顏慶津著 P39 執行輸入為: 執行結果為: 以下是函式內容(儲存為gauss.m檔案,在MATLAB中執行): %function [G,d,x,N]=gauss(A,b) %Gauss-Seidel迭代
數值分析(三):C++實現線性方程組的高斯-賽德爾迭代法
線性方程組的直接解法之後,就輪到迭代解法了,直接解法針對的是低階稠密矩陣,資料量較少,而工程上有更多的是高階係數矩陣,使用迭代法效率更高,佔用的空間較小。 迭代法的最基本思想就是由初始條件,比如說初始解向量隨便列舉一個,就0向量也行,然後進行迭代,k到k+1,一步一步從k=1開始去逼近真實解
python 迭代法和遞迴 實現斐波那契演算法
題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少? 1.程式分析: 兔子的規律為數列1,1,2,3,5,8,13,21…. 由規律可知: f(n) = f(n-1)+f(n-2) 符合斐波那契數
基於matlab的Guass-Seidel(高斯--賽德爾) 迭代法求解線性方程組
演算法解釋見此:https://blog.csdn.net/zengxyuyu/article/details/53056453 原始碼在此: main.m clear clc A = [8 -3 2;4 11 -1;6 3 12]; b = [20;33;36]; [
基於matlab的jacobi(雅可比)迭代法求解線性方程組
說明推導見此部落格:https://blog.csdn.net/zengxyuyu/article/details/53054880 原始碼見下面: main.m clear clc A = [8 -3 2;4 11 -1;6 3 12]; b = [20;33;36]; [x, n]
MATLAB入門學習-#6-Jacobi、Gauss-Seidel、SOR迭代法程式設計練習
MATLAB入門學習-#6-Jacobi、Gauss-Seidel、SOR迭代法程式設計練習 1.Jacobi迭代法 2.Gauss-Seidel迭代法 3.SOR迭代法(鬆弛法) 這三種迭代法是在數值分析課程裡學到的,都是求解線性
二分法Python程式碼實現,迭代和非迭代法
1 看程式碼吧, #用迭代實現二分法 #寫個類吧 class Solution: def binarySearch(self, nums, target): return self.search(nums, 0, len(nums) - 1, target) de
雅可比(jacobi)迭代法,c語言實現
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #in
Python學習--斐波那契數列--迭代法和遞迴法實現
斐波那契數列實現的兩種方式 迭代法: 使用迭代法速度快,運算幾乎不用等待,例如計算99代,可以瞬間出答案,效率比遞迴法快,但是程式冗雜。 def fib(n): n1 = 1 n2 = 1 n3 = 1 if n < 1:
python實現雅克比(Jacobi)迭代法
# -*- coding: utf-8 -*- #Jacobi迭代法 輸入係數矩陣mx、值矩陣mr、迭代次數n、誤差c(以list模擬矩陣 行優先) def Jacobi(mx,mr,n=100,c=0.0001): if len(mx) == len(mr):
python實現高斯(Gauss)迭代法
#Gauss迭代法 輸入係數矩陣mx、值矩陣mr、迭代次數n(以list模擬矩陣 行優先) def Gauss(mx,mr,n=100): if len(mx) == len(mr): #若mx和mr長度相等則開始迭代 否則方程無解 x = [] #
牛頓迭代法解非線性方程組(MATLAB版)
牛頓迭代法,又名切線法,這裡不詳細介紹,簡單說明每一次牛頓迭代的運算:首先將各個方程式在一個根的估計值處線性化(泰勒展開式忽略高階餘項),然後求解線性化後的方程組,最後再更新根的估計值。下面以求解最簡單的非線性二元方程組為例(平面二維定位最基本原理),貼出原始碼: 1、
MATLAB 牛頓迭代法解非線性方程組
牛頓迭代法流程圖: Newton迭代法計算步驟 : (1) 取初始點x0,最大迭代次數N和精 度 ε。 (2) 如果 f' (x0)=0, 則停止計算;否則計算 x1 = x0 -f(x0)/
matlab二分法,單點弦截法,牛頓切線迭代法
二分法 %p222task2_3 %二分法求[email protected](x)1-x-sin(x)零點 clc,clear; [email protected](x)1-x-sin(x) b=1;a=0; f(0) f(1) ez
梯度下降法,牛頓法,高斯-牛頓迭代法,附程式碼實現
---------------------梯度下降法------------------- 梯度的一般解釋: f(x)在x0的梯度:就是f(x)變化最快的方向。梯度下降法是一個最優化演算法,通常也稱為最速下降法。 假設f(x)是一座山,站在半山腰,往x方向走1米,高度上