本篇是在課程學習中自己程式設計實現的史蒂芬森加速迭代法計算非線性方程或者超越方程近似根的演算法,寫一下,後邊便於複習和期末課程設計引用。艾特金加速法本質上和史蒂芬森加速方法是相同的,因此實現史蒂芬森加速法即可,對**稍加修改即可實現艾特金加速法。
% 史蒂芬森加速迭代法求根的matlab演算法
function [x_k,x0,counter]
=steffensen
(a,err,f_x)%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%輸入引數a為迭代初值 %
%輸入引數err為誤差精度 %
%輸入引數f_x為不動點迭代函式,即滿足x=
f_x(x)的函式 %
%輸出引數x_k為迭代序列 %
%輸出引數x0為滿足精度要求的根 %
%輸出引數counter為迭代的次數 %%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%%%
%%counter=0;
%計數器初始化
x_k=(0
);%序列初始化
while
(sign
(f_x
(a))==0
)%如果a的函式值為0停止迭代輸出x0為a的值,迭代次數為0
x0=a;
x_k(1)
=a; counter=0;
return
;end
while
(sign
(f_x
(a))~=
0)%a的函式不為零進行迭代
x_k(counter+1)
=a;%將a賦給序列第乙個值並作為第乙個初值
y_k=
f_x(
x_k(counter+1)
);%不動點迭代求第二個初值
z_k=
f_x(y_k)
;%不動點迭代求第三個初值
a=x_k(counter+1)
-( y_k-
x_k(counter+1)
).^2.
/(z_k-
2*y_k+
x_k(counter+1)
);%用史蒂芬森加速方法加速迭代
counter=counter+1;
%每迭代一次計數器加一
x_k(counter+1)
=a;%將當前值賦值給序列
if(abs
(x_k
(counter+1)
-x_k
(counter)
)>=err)
%精度判斷
steffensen
(a,err,f_x)
;%不滿足精度時遞迴呼叫迭代函式本身進行迭代
else
x0=a;
%將滿足誤差精度要求得a賦值給x0
return
; end
endend
結果
特別說明:
閱讀原始碼的方法
首先要有大體的概念,然後再讀功能,最後再讀細節,欣賞一些精彩的 對於一篇原始碼讀懂的大體思路 在單執行緒的情況下 搞清楚每個函式的作用,元件的作用,之後就知道了這篇原始碼的作用,輸入是什麼,輸出是什麼,作用是什麼 然後就是程式邏輯了,複雜的邏輯需要反覆,慢慢看,看的時候只需順清楚主線流程就行,一些i...
addPosition方法的原始碼
package indexwriter import org.apache.lucene.index.term import org.apache.lucene.index.termvectoroffsetinfo 在invertdocument方法中,通過addposition方法向posting...
原始碼安裝MySql的方法
redhat 4.7 這個配置檔案能編譯通過 configure prefix usr local mysql enable thread safe client enable assembler with client ldflags all static with mysqld ldflags ...