|
代碼可以直接代入使用。 xcB\Y:
4EB\R"rWXf - %% 牛頓迭代法
- function sol = Newton_iterative(f,x0,eps,maxiter)%(符號方程、初值、精度、最大迭代次數(shù))
- %sol為輸出參數(shù),sol是一個結(jié)構(gòu)體,包含了迭代過程的信息
-
- %% 輸入?yún)?shù)的控制
- if nargin == 3
- maxiter = 100;
- elseif nargin == 2
- maxiter = 100;
- eps = 1e-6;
- elseif nargin < 2 || nargin > 4
- error('錯誤');
- end
-
- %% 變量的初始化: x(k+1) = x(k) - f(x(k))/f'(x(k))
- x_k1 = x0; %x(k)表示迭代上一次的值;
- x_k2 = x0; %x(k+1)表示迭代下一次的值;
- df = diff(f,symvar(f),1); %表示方程的一階導(dǎo)數(shù);symvar(f)查找f的自變量x
-
- %% 利用牛頓迭代思想,進行數(shù)值逼近
- fprintf('\n%5s %20s %25s\n', '迭代次數(shù)', '近似解', '誤差')
- for k = 1:1:maxiter %迭代次數(shù)
- x_k1 = x_k2; %迭代序列,x0,x1,x2,x3......
- fx = subs(f,symvar(f),x_k1); %求f(x(k))
- dfx = subs(df,symvar(f),x_k1);
- x_k2 = x_k1 - fx/dfx;
- errval = abs(double(subs(f,symvar(f),x_k2))); %每次迭代誤差大小
- %迭代過程輸出
- fprintf('%3d %20.15f %24.15f\n', k, x_k2, errval);
- if errval <= eps %滿足精度要求時退出迭代
- break;
- end
- end
- %% 迭代收斂的問題
- if k > maxiter
- disp('達到最大迭代次數(shù),可能不收斂');
- return
- end
-
- %% 輸出參數(shù)的控制
- if nargout == 1
- sol.info = '迭代收斂,逼近終止';
- sol.X = x_k2;
- sol.norm_error = errval;
- sol.iterative = k;
- sol.eps = eps;
- sol.success = '成功';
- elseif nargout == 0
- sol = [];
- end
- end
- %% 關(guān)于subs
- % 在matlab中,subs函數(shù)是用于對符號表達式進行替換的函數(shù)。它可以用來替換符號表達式中的變量或符號,或者將符號表達式中的符號替換為具體的數(shù)值。
- % new_expression = subs(expression, old, new)
- % 其中,expression 是要進行替換操作的符號達式,old 是要被替換的變量或符號,new 是替換后的變量或符號或數(shù)值。
wI%M3XaBws
|