1. 程式人生 > >迭代法——Matlab中實現

迭代法——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米,高度上