Matlab迭代算法实现

牛顿迭代法

雅可比迭代法


高斯赛德迭代法


超松弛迭代法(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即为所求的值

Jacobi 迭代法函数

代码实现案例:

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

Gauss-Seidel 迭代法函数

代码实现案例:

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

  • 8
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值