1. 程式人生 > >【數值分析】迭代法解方程:牛頓迭代法、Jacobi迭代法

【數值分析】迭代法解方程:牛頓迭代法、Jacobi迭代法

牛頓迭代公式

設已知方程f(x)=0的近似根x0 ,則在x0附近f(x)可用一階泰勒多項式近似代替.因此, 方程f(x)=0可近似地表示為p(x)=0。用x1表示p(x)=0的根,它與f(x)=0的根差異不大. 

,由於x1滿足解得


重複這一過程,得到迭代公式:

  這就是著名的牛頓迭代公式,它相應的不動點方程為

Jacobi迭代公式解線性方程組

線性方程組基本解法:
方程組可同解變形為

Jacobi迭代法的計算公式:

即 

演算法程式碼

/*簡單迭代法的程式碼實現*/
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
double e=2.718281818284;
double f(double x){
	return pow(e,-1*x);
}
void SimpleDiedai(double x,double d){
	double a=x;
	double b=f(a);
	int k=0;//記錄迴圈的次數
	while(((a-b)>d) || ((a-b)<-1*d)){
		cout<<a<<endl;
		a=b;
		b=f(a);
		k++;
		if(k>100){
			cout<<"迭代失敗!(可能是函式不收斂)"<<endl;
			return ;
		}
	}
	cout<<b<<endl;
	return;
}
int main(){
	cout<<"請輸入初始值x0和要求得結果的精度:";
	double x,d;
	cin>>x>>d;
	SimpleDiedai (x,d);
	return 0;
}

/*牛頓迭代法的程式碼實現*/
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
double e=2.718281818284;
double f(double x){
	double a=pow(e,-1*x);
	return x-(x-a)/(1+a);
}
void NewtonDiedai(double x,double d){
	double a=x;
	double b=f(a);
	int k=0; //記錄迴圈的次數
	while(((a-b)>d) || ((a-b)<-1*d)){
		cout<<a<<endl;
		a=b;
		b=f(a);
		k++;
		if(k>100){
			cout<<"迭代失敗!(可能是函式不收斂)"<<endl;
			return ;
		}
	}
	cout<<b<<endl;
	return;
}

int main(){
	cout<<"請輸入初始值x0和要求得結果的精度:";
	double x,d;
	cin>>x>>d;
	NewtonDiedai(x,d);
	return 0;
}

/*雅可比演算法的程式碼實現*/
#include<iostream>
#include<iomanip>
#include<string>
#include<vector>
using namespace std;	  

//函式求陣列中的最大值
double MaxOfList(vector<double>x){
	double max=x[0];
	int n=x.size();
	for(int i=0;i<n;i++)
		if(x[i]>max) max=x[i];
	return max;
}

//雅可比迭代公式
void Jacobi(vector<vector<double> > A,vector<double> B,int n){
	vector<double> X(n,0);
	vector<double> Y(n,0);
	vector<double> D(n,0);
	int k=0; //記錄迴圈次數
	do{	
		X=Y;
		for(int i=0;i<n;i++){
			double tem=0;
			for(int j=0;j<n;j++){
				if(i!=j) tem += A[i][j]*X[j];
			}
			Y[i]=(B[i]-tem)/A[i][i];
			cout<<left<<setw(8)<<Y[i]<<" ";
		}
		cout<<endl;
		k++;
		if(k>100){
			cout<<"迭代失敗!(可能是函式不收斂)"<<endl;
			return ;
		}
		
		for(int a=0;a<n;a++){
			D[a]=X[a]-Y[a];
		}
	}while( MaxOfList(D)>0.00001 || MaxOfList(D)<-0.00001);
	
	return ;
}

int main(){

	int n;
	cout<<"請輸入方程組未知數的個數n:";
	cin>>n;
	cout<<endl;

	vector<vector<double> >A(n,vector<double>(n,0));
	vector<double>B(n,0);
	
	cout<<"請輸入方程組的係數矩陣:"<<endl;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>A[i][j];
		}
	}
	cout<<endl;
	
	cout<<"請輸入方程組的值向量:"<<endl;
	for(int k=0;k<n;k++){
		cin>>B[k];
	}
	cout<<endl;
	
	cout<<"您輸入的方程組為:"<<endl;
	for(int a=0;a<n;a++){
		for(int b=0;b<n;b++){
			cout<<A[a][b]<<" ";
		}
		cout<<"    "<<B[a]<<endl;
	}
	cout<<endl;
	cout<<"由雅可比迭代公式求的方程組的解為:"<<endl;
    Jacobi(A,B,n);
	return 0;
}

實驗過程原始記錄

(1)分別用簡單迭代法和牛頓迭代法求方程在x=0.5附近的一個根x*,要求精度為0.00001
(輸入0.5 0.000001)簡單迭代法得到結果:

(輸入0.5 0.000001)牛頓迭代法得到結果:
X0=0.5  x1=0.566311 x2=0.567143
(2)用雅可比迭代法求解方程組  
執行程式,根據提示輸入 (3) (10 -1 -2 -1 10 -2 -1 -2 5)    (7.2  8.3  4.2)

實驗結果及分析

1、迭代法是一種逐次逼近法,這種方法使用某個固定公式-所謂迭代公式反覆校正根的近似值,使之逐步精確化,直至滿足精度要求的結果。迭代法是一種求解函式方程f(x)=0的解的方法,他解決了二分法無法求解復根級偶重根的問題,而其提高了收斂速度。迭代的思想是計算方法中基礎的求解問題的思想。
2、簡單迭代法的求根過程分成兩步,第一步先提供根的某個猜測值,即所謂迭代初值,然後將迭代初值逐步加工成滿足精度要求的根。迭代法的設計思想是:f (x) = 0等價變換成 然後由迭代公式 逐步球的滿足精度的解。實際迭代中不同迭代函式的求解可能影響求的精確解的運算量,甚至可能因為函式發散而無法求解。解題時可通過對導函式的判斷而判斷函式是否發散,而編寫程式碼時可以通過判斷迴圈次數——即迴圈過多次而不能從迴圈中出來時就判斷為死迴圈,無法求得正解
3、簡單迭代法往往只是線性收斂,為得出超線性收斂的迭代格式,通常採用近似替代法
, 即牛頓公式。迭代函式為  - / 牛頓法是一種逐步線性化方法。由實驗結果可以看到,雖然選取近似公式,但牛頓迭代法仍能得到精度很高的解,而且牛頓迭代法大大提高了收斂速度。
4、由迭代法求解線性方程組的基本思想是將聯立方程組的求解歸結為重複計算一組彼此獨立的線性表示式,這就使問題得到了簡化,類似簡單迭代法轉換方程組中每個方程式可得到雅可比迭代式
迭代法求解方程組有一定的侷限性,例如要求方程組的係數矩陣具有某種特殊性質,以保證迭代過程的收斂性,但迭代法同時有十分明顯的優點——演算法簡單,因而編制程式比較容易,所以在實際求解問題中仍有非常大利用價值。

相關推薦

數值分析方程牛頓Jacobi

牛頓迭代公式 設已知方程f(x)=0的近似根x0 ,則在x0附近f(x)可用一階泰勒多項式近似代替.因此, 方程f(x)=0可近似地表示為p(x)=0。用x1表示p(x)=0的根,它與f(x)=0的根差異不大. 設 ,由於x1滿足解得 重複這一過程,得到迭代公式:  

數值分析插值拉格朗日插值牛頓插值

給定函式四個點的資料如下: 試用拉格朗日插值確定函式在x=2.101,4.234處的函式值。 執行得到結果: 已知用牛頓插值公式求的近似值。 執行程式得到結果:   2.26667 實驗分析 1、Lagrange插值法和Newton插值法解決實際問題中關於只提供複雜的離散資料的函式求值問題,通過將所考察的函式

數值分析—— 深度學習中的數值計算技巧

underflow:浮點數下溢,數值逼近 0 時出現; 0 作除數, 對 0 取對數; overflow:浮點數上溢,數值逼近無窮大時出現; 浮點數溢位,不論是上溢還是下溢,會使得最終的結果 Un

演算法分析回溯八皇后問題(n皇后問題)

回溯法解題思路: (1)針對所給問題,定義問題的解空間;    (2)確定易於搜尋的解空間結構;    (3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。 八皇后問題:

C語言實現牛頓方程

利用迭代演算法解決問題,需要做好以下三個方面的工作: 一、確定迭代變數 在可以用迭代演算法解決的問題中,我們可以確定至少存在一個可直接或間接地不斷由舊值遞推出新值的變數,這個變數就是迭代變數。 二、建立迭代關係式 所謂迭代關係式,指如何從變數的前一個值推出其下一

演算法分析回溯解數獨(九宮格)演算法

這篇文章,是來詳細介紹怎樣寫出一個演算法,來解出所有的數獨問題。演算法的程式執行時間,縮減在了毫秒級別。等到這篇文章結束,我會抽時間寫一篇文章,介紹如何生成一個隨機的唯一解的數獨問題。 另外,為了做圖形方便,示範程式碼是用C++,喜歡其他語言的朋

python實現方程

一元三次方程x^3-2x+1=0,給定誤差0.0001,迭代法求解。有3個實數解,其中一個是1。 有最大迭代次數判斷,以及判斷迭代是否收斂的演算法。 牛頓迭代法 # -*- coding= utf-

Flume原始碼分析flumeng的事務控制的原理詳記憶體通道memory channel

一開始我也是以為flume ng的事務控制是在sink端的,因為只看到那裡有事務的使用,但是今天看了一下fluem的整個事務控制,我才後知後覺,特此寫了這篇文章,望各位不吝指教。 先來一張圖吧!!! 從圖中可以看出,flume的事務控制在source端和sink端都有,具

Java執行緒池的ctl(執行緒池控制狀態)原始碼分析

0.綜述  ctl 是執行緒池原始碼中常常用到的一個變數。 它的主要作用是記錄執行緒池的生命週期狀態和當前工作的執行緒數。 作者通過巧妙的設計,將一個整型變數按二進位制位分成兩部分,分別表示兩個資訊。 1.宣告與初始化   原始碼: 1 private final AtomicInt

協議分析HTTP響應頭中的2種編碼方式介紹

href intro feo 發送 文檔 bsp firefox cep 目前 HTTP 1.1中有兩個實體頭(Entity-Header)直接與編碼相關,分別為Content-Encoding和Transfer-Encoding。 先說Content-Encodin

IP分析合並信號concat,拆分總線slice

信號 com images logs 合並 這一 -1 image mage 一般都是把幾個零散的中斷信號合並成bus,連到系統中斷總線上。 比如出個GPIO[31:0]來控制bram的幾個控制信號,分配如下: GPIO[24] - clk (可以直接指定[24]這

CONTINUE...?構造/分析

def tails pro elong %s specific ber exce ace CONTINUE...? Time Limit: 1 Second Memory Limit: 65536 KB Special Judge DreamGrid h

取證分析Wannacry樣本取證特征與清除

english version class ros cpu占用率 .exe crypt 重要 解析 一、取證特征 1)網絡域名特征 http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com 2)文件特征 母體文件 ms

取證分析The Art of Memory Forensics-Windows取證(Virut樣本取證)

文件 explorer 父進程 所有 ddr png 筆記 特定 sni 1、前言 The Art of Memory Forensics真是一本很棒的書籍,其中使用volatility對內存進行分析的描述可以輔助我們對更高級類的木馬進行分析和取證,這裏對書中的命令進行了筆

取證分析Linux信息搜集

相關信息 查看系統 hist PC 系統用戶 啟動項順序 print 內核版本號 uname ## 1、取證工具 - LiME 內存獲取工具 - volatility 內存分析工具 ## 2、機器信息收集 #sysinfo 16 # # 查看當前登錄用戶 who

數值優化基礎

問題 9.png com 二次規劃 spa ext 誤差 style span “數值”優化:設置算法時,要考慮舍入誤差。 數值優化問題分類: 無約束優化 VS 約束優化 線性規劃。目標函數和約束函數都是線性的 二次規劃。目標函數為二次的,約束函數為線性。 凸優化。目標

情感分析北航課題組 筆記二

樣本 數學運算 ica 存儲 wid seed sci 進階 space 主講:莊老師 數據處理利器—— Numpy 簡介   優點     運算快     封裝好   數據存儲     可存儲為一維數組、二維數組、多維數組    Numpy, Pandas, S

C語言二維陣列魔方陣

解題思路: 魔方陣的排列規律如下(思路來自網際網路): 注意:剛開始我也沒看懂,但是相信我多看幾遍理解已經能看懂的。 如3×3的魔方陣:      8   1   6  &nbs

取證分析用linux命令xxd來獲取dump檔案資訊獲得flag

題目連結:https://blog.csdn.net/xiangshangbashaonian/article/details/82747394 拿到一道CTF題目  notepad++開啟如下所示 [email protected]:~/Desktop$ fi

資料分析電商平臺數據分析

目錄 電商模式 年度重複購買率 轉化率 年均購買率 購物車大小 棄買率 客戶獲取成本 平均每位客戶營收 關鍵詞和搜尋詞 推薦接受率 病毒性 郵件列表點入率 線下線上相結合 運送時間 庫存可供率