牛顿迭代法
雅可比迭代法
高斯赛德迭代法
超松弛迭代法(SOR)
共轭迭代法
代码实现案例:
- %% 原函数输入
- function y = newton(x)
- y = exp(-x/4)*(2-x)-1;%任意函数
- end
- % 保存要进行牛顿迭代的函数
- % 牛顿迭代函数生成
- function y = newton1(x)
- syms a;
- f = a - (newton(a)./diff(newton(a)));
- y = subs(f,x);%牛顿迭代公式
- end
- %如果直接用y和x来实现的话,在掉用原函数的时候就算出了具体数值,公式中的求导就会变为0,
- % 无法求解,所以先用f,a来代替y和x,最后再进行替换,实现牛顿迭代公式。
- % 牛顿迭代
- x = input('x=');%开始迭代最初的x
- eps = input('eps=');%定义所要求解的精度
- syms x1;%定义两Xk+1和Xk的差,一次来限制精度的要求
- x1=100;
- syms xa;
- xa=x;
- syms xb;%记录上一个x和下一个x
- while x1>eps
- xb = xa;
- xa = newton1(xb);
- x1 = abs(xa-xb);%得到▲x
- end
- disp('该函数符合规定精度的解是:');
- double(xa)
- % xa即为所求的值
代码实现案例:
- 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
代码实现案例:
- 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
代码实现案例:
- 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
代码实现案例:
- 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