1. 程式人生 > >Jacobi和Gauss-Seidel迭代法求解方程組

Jacobi和Gauss-Seidel迭代法求解方程組

迭代法簡介

迭代法也稱輾轉法,是一種不斷用變數的舊值遞推新值的過程,跟迭代法相對應的是直接法(或者稱為一次解法),即一次性解決問題。迭代演算法是用計算機解決問題的一種基本方法,它利用計算機運算速度快、適合做重複性操作的特點,讓計算機對一組指令(或一定步驟)進行重複執行,在每次執行這組指令(或這些步驟)時,都從變數的原值推出它的一個新值,迭代法又分為精確迭代和近似迭代。比較典型的迭代法如“二分法”和"牛頓迭代法”屬於近似迭代法。

Jacobi迭代

以如下方程組為例:
10 x

1 2 x 2 x 3
= 3 10x{_1}-2x{_2}-x{_3}=3
2 x 1
+ 10 x 2 x 3 = 15 -2x{_1}+10x{_2}-x{_3}=15

1 x 1 2 x 2 5 x 3 = 10 -1x{_1}-2x{_2}-5x{_3}=10

高斯消元法(高中用的那種)可以算出結果分別為1,2,3

Jacobi的計算過程:
先對每行分別進行變換,左邊分別只留下 x 1 x 2 x 3 x{_1}、x{_2}、x{_3}
x 1 = 0.2 x 2 + 0.1 x 3 + 0.3 x{_1}=0.2x{_2}+0.1x{_3}+0.3
x 2 = 0.2 x 1 + 0.1 x 3 + 1.5 x{_2}=0.2x{_1}+0.1x{_3}+1.5
x 3 = 0.2 x 1 + 0.4 x 2 + 2 x{_3}=0.2x{_1}+0.4x{_2}+2
相信大家到這一步都會,那麼我們就開始分別計算 x 1 x 2 x 3 x{_1}、x{_2}、x{_3} 的值吧。

先設 x 1 x 2 x 3 x{_1}、x{_2}、x{_3} 都為0,第一次迭代,他們的結果分別為: 0.3 1.5 2 0.3、1.5、2

然後把 0.3 1.5 2 0.3、1.5、2 分別帶入 x 1 x 2 x 3 x{_1}、x{_2}、x{_3} 計算,則:
x 1 = 0.2 x 2 + 0.1 x 3 + 0.3 = 0.2 1.5 + 0.1 2 + 0.3 = 0.8 x{_1}=0.2x{_2}+0.1x{_3}+0.3=0.2*1.5+0.1*2+0.3=0.8
x 2 = 0.2 x 1 + 0.1 x 3 + 1.5 = 0.2 0.3 + 0.1 0.2 + 1.5 = 1.76 x{_2}=0.2x{_1}+0.1x{_3}+1.5=0.2*0.3+0.1*0.2+1.5=1.76
x 3 = 0.2 x 1 + 0.4 x 2 + 2 = 0.2 0.3 + 0.4 1.5 + 2 = 2.66 x{_3}=0.2x{_1}+0.4x{_2}+2=0.2*0.3+0.4*1.5+2=2.66

迭代10次可得結果如下:

次數 x 1 x{_1} x 2 x{_2} x 3 x{_3}
1 0.3 1.5 2.0
2 0.8 1.76 2.66
3 0.918 1.926 2.864
4 0.972 1.97 2.954
5 0.989 1.99 2.982
6 0.996 1.996 2.994
7 0.999 1.999 2.998
8 1.0 2.0 2.999
9 1.0 2.0 3.0
10 1.0 2.0 3.0

其python程式碼如下:

x1=0
x2=0
x3=0
print('Jacobi')
for i in range(10):
    x11=round(0.2*x2+0.1*x3+0.3,3)
    x22=round(0.2*x1+0.1*x3+1.5,3)
    x33=round(0.2*x1+0.4*x2+2,3)
    print('|',i+1,'|',x11,'|',x22,'|',x33,'|')
    x1=x11
    x2=x22
    x3=x33

其中round是將結果保留3位小數。

上面這個過程叫Jacobi迭代。

Gauss-Seidel迭代

高斯迭代唯一的區別在於,在每次迭代的過程中,都使用最新的值,直接上程式碼大家應該也可以看明白:

x1=0
x2=0
x3=0
print('Gauss-Seidel')
for i in range(10):
    x1
            
           

相關推薦

JacobiGauss-Seidel求解方程組

迭代法簡介 迭代法也稱輾轉法,是一種不斷用變數的舊值遞推新值的過程,跟迭代法相對應的是直接法(或者稱為一次解法),即一次性解決問題。迭代演算法是用計算機解決問題的一種基本方法,它利用計算機運算速度快、適合做重複性操作的特點,讓計算機對一組指令(或一定步驟)進行重複執行,在每次執行這組

數值分析 Gauss-Seidel求解線性方程組 MATLAB程式實現

Gauss-Seidel迭代法 參考數值分析第四版 顏慶津著 P39 執行輸入為: 執行結果為: 以下是函式內容(儲存為gauss.m檔案,在MATLAB中執行): %function [G,d,x,N]=gauss(A,b) %Gauss-Seidel迭代

Jacobi Gauss-Seidel

按照演算法(Jacobi迭代法)編寫Matlab程式(Jacobi.m) function [x, k, index]=Jacobi(A, b, ep, it_max) % 求解線性方程組的Jacobi迭代法,其中 %   A --- 方程組的係數矩陣 %   b

Jacobi求解方程組

JacobiFile.h #include <iostream> #include <stdlib.h> #include <malloc.h> #include <math.h> #include "Jacobi.h" /

雅克比與高斯塞德爾求解方程組(C語言)

分別用雅可比 迭代法與高斯塞德爾迭代法解下列方程組: 雅可比迭代法: #include<stdio.h> #include<math.h> #define eps 1

基於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]

[數值分析]不動點求解非線性方程

Promble1 求出f(x)=3x2−ex=0f(x)=3x2−ex=0的根,精確到小數點後的第4位。 解 首先我們利用matlab繪圖確定出根的大致區域。 由圖可知存在三個有根區間[−1

Guass-seidel matlab實現

clc clear n = input('請輸入矩陣階數:\n'); for i = 1:n fprintf('請輸入矩陣第%d行\n',i); A(i,:) = input('');

高斯-塞德爾求解線性方程組

高斯-塞德爾迭代法也是求解線性方程組解的一種方法,與雅可比不同之處在於,求解某個未知數的某代值時,直接使用上一未知數在該代的值。 C++程式碼如下: #include<stdio.h> #include<math.h> using namespa

最優化方法:牛頓擬牛頓

基礎拐點若曲線圖形在一點由凸轉凹,或由凹轉凸,則稱此點為拐點。直觀地說,拐點是使切線穿越曲線的點。拐點的必要條件:設f(x){\displaystyle f(x)}在(a,b){\displaystyle (a,b)}內二階可導,x0∈ (a,b){\displaystyle

利用牛頓求解非線性方程組

       最近一個哥們,是用牛頓迭代法求解一個四變數方程組的最優解問題,從網上找了程式碼去改進,但是總會有點不如意的地方,迭代的次數過多,但是卻沒有提高精度,真是令人揪心!        經分析,

牛頓求解一個數的n次方根

1.泰勒展開n階可微函式f(x)在x=x0處的展開為2.牛頓迭代法對於求a的立方根,可以設f(x)=x^3-a,從而轉換成求解f(x)=0,即求方程的根。對於求a的平方根,設f(x)=x^2-a,從而轉換成求解f(x)=0初始化可以令x0=1,當兩次求解的差的絕對值小於0.0

二分,newton求解非線性方程組

解:package shuzhifenxi; publicclass Exam411 { publicstatic Boolean th = true; publicstaticintcount 

牛頓求解方程

說明:該篇部落格源於博主的早些時候的一個csdn部落格中的一篇,由於近期使用到了,所以再次作一總結。原文地址 概述 牛頓迭代法(Newton’s method)又稱為牛頓-拉夫遜(拉弗森)方法(Newton-Raphson method),它是牛頓在17

使用牛頓求解n次方根

一、牛頓迭代法的原理       1.定義摘自百度百科:            因此,我們的f(x)=xn   f '(x)=nxn-1 .      2.java實現 import java.util.Scanner; public class NewtonMetho

簡單求解方程舉例

迭代法是方程及方程組求解的重要方法。關於其原理可另行查詢。這裡附上一篇簡單的迭代法小程式。 用於解方程:x+e^x=0,求解精度0.00001. #include<stdio.h> #include<math.h> #define fnx(x) -

演算法分析與設計-求解方程(組)的根(詳解)

演算法分析設計課之期末考試前的重要演算法複習總結。。。以下內容大多都摘抄自上課的課件的內容,但是課件沒有解方程的完整程式碼,於是自己又寫了寫程式碼,僅供參考。首先,迭代法解方程的實質是按照下列步驟構造一個序列x0,x1,…,xn,來逐步逼近方程f(x)=0的解:1)選取適當的

求解非線性方程組

#include<iostream> #include<math.h> using namespace std; int M;//允許迭代最大次數 double E;//允許的誤差 /*針對式子:x^2-10x+y^2+23=0xy^2+x-10y^

求解線性方程組(C++實現)

本系列是數值分析相關演算法的文章,這次用迭代法求解線性方程組,不同於上次用高斯消元法之類的求解。迭代法對於稀疏矩陣方程組的運算,會大大提高。而如果用高斯相關的演算法求解,會浪費大量資源計算無用的東西,所以有必要研究此演算法。 本文章主要使用了3個演算法,分別是