• Matlab迭代算法实现


    牛顿迭代法

    雅可比迭代法


    高斯赛德迭代法


    超松弛迭代法(SOR)


    共轭迭代法

    牛顿迭代法

    代码实现案例:

    1. %% 原函数输入
    2. function y = newton(x)
    3. y = exp(-x/4)*(2-x)-1;%任意函数
    4. end
    5. % 保存要进行牛顿迭代的函数
    1. % 牛顿迭代函数生成
    2. function y = newton1(x)
    3. syms a;
    4. f = a - (newton(a)./diff(newton(a)));
    5. y = subs(f,x);%牛顿迭代公式
    6. end
    7. %如果直接用y和x来实现的话,在掉用原函数的时候就算出了具体数值,公式中的求导就会变为0
    8. % 无法求解,所以先用f,a来代替y和x,最后再进行替换,实现牛顿迭代公式。
    1. % 牛顿迭代
    2. x = input('x=');%开始迭代最初的x
    3. eps = input('eps=');%定义所要求解的精度
    4. syms x1;%定义两Xk+1和Xk的差,一次来限制精度的要求
    5. x1=100;
    6. syms xa;
    7. xa=x;
    8. syms xb;%记录上一个x和下一个x
    9. while x1>eps
    10. xb = xa;
    11. xa = newton1(xb);
    12. x1 = abs(xa-xb);%得到▲x
    13. end
    14. disp('该函数符合规定精度的解是:');
    15. double(xa)
    16. % xa即为所求的值

    Jacobi 迭代法函数

    代码实现案例:

    1. function [x,y] = Jacobi(n, A ,b)
    2. %y = zeros(1000,1);
    3. eps = 1.0e-6;
    4. D = diag(diag(A));
    5. L = -tril(A, -1);
    6. U = -triu(A, 1);
    7. B = D\(L+U);
    8. f = D\b;
    9. count = 1;
    10. x0 = zeros(n,1);
    11. x = B*x0 + f;
    12. tic;
    13. while norm(x-x0)> eps
    14. x0 = x;
    15. %y(count) = norm(x-A\b);
    16. x = B*x0 + f;
    17. count = count + 1;
    18. if count > 2000
    19. disp('error:该矩阵不收敛');
    20. return;
    21. end
    22. end
    23. toc;
    24. y = toc;
    25. disp(count);
    26. end

    Gauss-Seidel 迭代法函数

    代码实现案例:

    1. function [x, y]= Gauss_Seidel(n, A ,b)
    2. %y = zeros(1000,1);
    3. eps = 1.0e-6;
    4. D = diag(diag(A));
    5. L = -tril(A, -1);
    6. U = -triu(A, 1);
    7. B = (D - L)\U;
    8. f = (D - L)\b;
    9. count = 1;
    10. x0 = zeros(n,1);
    11. x = B*x0 + f;
    12. tic;
    13. while norm(x-x0) > eps
    14. x0 = x;
    15. % y(count) = norm(x-A\b);
    16. x = B*x0 + f;
    17. count = count + 1;
    18. if count > 2000
    19. disp('error:该矩阵不收敛');
    20. return;
    21. end
    22. end
    23. toc;
    24. y = toc;
    25. disp(count);
    26. end

    逐次超松弛迭代法函数

    代码实现案例:

    1. function [x, y] = SOR(n, A ,b, w)
    2. y = zeros(1000,1);
    3. eps = 1.0e-6;
    4. D = diag(diag(A));
    5. L = -tril(A, -1);
    6. U = -triu(A, 1);
    7. B = (D - w*L) \ ((1-w) * D + w*U);
    8. f = w * inv(D - w*L) * b;
    9. count = 1;
    10. x0 = zeros(n,1);
    11. x = B*x0 + f;
    12. tic;
    13. while norm(x-x0) > eps
    14. x0 = x;
    15. y(count) = norm(x-A\b);
    16. x = B*x0 + f;
    17. count = count + 1;
    18. if count > 2000
    19. disp('error:该矩阵不收敛');
    20. return;
    21. end
    22. end
    23. toc;
    24. y = toc;
    25. disp(count);
    26. end

    共轭梯度法函数

    代码实现案例:

    1. function [x, y] = CG(n, A , b)
    2. y = zeros(1000,1);
    3. eps = 1.0e-6;
    4. x0 = zeros(n,1);
    5. r0 = b - A * x0;
    6. p0 = r0;
    7. count = 1;
    8. tic;
    9. while norm(p0) > eps
    10. a = r0'*r0/(p0'*A*p0);
    11. x = x0 + a*p0;
    12. r = r0 - a*A*p0;
    13. B = r'*r/(r0'*r0);
    14. p = r + B*p0;
    15. p0 = p;
    16. r0 = r;
    17. x0 = x;
    18. % y(count) = norm(x-A\b);
    19. count = count + 1;
    20. if count > 2000
    21. disp('error:该矩阵不收敛');
    22. return;
    23. end
    24. end
    25. toc;
    26. y = toc;
    27. disp(count);
    28. end

  • 相关阅读:
    简单认识:结构体的嵌套,结构体的传参
    RNA-Seq 笔记 [4]
    LeetCode·297.二叉树的序列化与反序列化·DFS·BFS
    解析边缘计算网关的优势-天拓四方
    集合和泛型
    Android 中级控件
    Spring事务属性
    为什么AirtestIDE的selenium Window突然无法检索控件了?
    Spring5应用之事务处理
    vue(2)
  • 原文地址:https://blog.csdn.net/weixin_51367832/article/details/126975906