切换到宽版
  • 广告投放
  • 稿件投递
  • 繁體中文
    • 891阅读
    • 2回复

    [分享]matlab牛顿迭代法源码 [复制链接]

    上一主题 下一主题
    离线13428299720
     
    发帖
    31
    光币
    114
    光券
    0
    只看楼主 倒序阅读 楼主  发表于: 2023-08-08
    代码可以直接代入使用。 pjN4)y>0  
    x5(6U>-Y  
    1. %% 牛顿迭代法
    2. function sol = Newton_iterative(f,x0,eps,maxiter)%(符号方程、初值、精度、最大迭代次数)
    3. %sol为输出参数,sol是一个结构体,包含了迭代过程的信息
    4. %% 输入参数的控制
    5.    if nargin == 3
    6.       maxiter = 100;
    7.    elseif nargin == 2
    8.       maxiter = 100;
    9.       eps = 1e-6;
    10.    elseif nargin < 2 || nargin > 4
    11.       error('错误');
    12.    end
    13. %% 变量的初始化:  x(k+1) = x(k) - f(x(k))/f'(x(k))
    14.    x_k1 = x0;   %x(k)表示迭代上一次的值;
    15.    x_k2 = x0;   %x(k+1)表示迭代下一次的值;
    16.    df = diff(f,symvar(f),1);   %表示方程的一阶导数;symvar(f)查找f的自变量x
    17. %% 利用牛顿迭代思想,进行数值逼近
    18.    fprintf('\n%5s %20s %25s\n', '迭代次数', '近似解', '误差')
    19.    for k = 1:1:maxiter   %迭代次数
    20.        x_k1 = x_k2;   %迭代序列,x0,x1,x2,x3......
    21.        fx = subs(f,symvar(f),x_k1);   %求f(x(k))
    22.        dfx = subs(df,symvar(f),x_k1);
    23.        x_k2 = x_k1 - fx/dfx;
    24.        errval = abs(double(subs(f,symvar(f),x_k2)));   %每次迭代误差大小
    25.        %迭代过程输出
    26.        fprintf('%3d %20.15f %24.15f\n', k, x_k2, errval);
    27.        if errval <= eps   %满足精度要求时退出迭代
    28.           break;
    29.        end
    30.    end
    31. %% 迭代收敛的问题
    32.    if k > maxiter
    33.       disp('达到最大迭代次数,可能不收敛');
    34.       return
    35.    end
    36. %% 输出参数的控制
    37.    if nargout == 1
    38.       sol.info = '迭代收敛,逼近终止';
    39.       sol.X = x_k2;
    40.       sol.norm_error = errval;
    41.       sol.iterative = k;
    42.       sol.eps = eps;
    43.       sol.success = '成功';
    44.    elseif nargout == 0
    45.       sol = [];
    46.    end
    47. end
    48. %% 关于subs
    49. %  在matlab中,subs函数是用于对符号表达式进行替换的函数。它可以用来替换符号表达式中的变量或符号,或者将符号表达式中的符号替换为具体的数值。
    50. %  new_expression = subs(expression, old, new)
    51. %  其中,expression 是要进行替换操作的符号达式,old 是要被替换的变量或符号,new 是替换后的变量或符号或数值。
    tEN8S]X  
     
    分享到
    发帖
    64
    光币
    19
    光券
    0
    只看该作者 1楼 发表于: 01-06
    谢谢楼主 &7XsyDo6  
    离线xxalzdp
    发帖
    7
    光币
    1
    光券
    0
    只看该作者 2楼 发表于: 10-29
    感谢楼主分享!