牛顿迭代法求极值的MATLAB实现

牛顿迭代法求函数极值的基本原理

牛顿迭代法是一种基于泰勒展开的数值优化方法,通过迭代逼近函数的极值点。对于一元函数 ( f(x) ),极值点需满足 ( f'(x) = 0 )。牛顿迭代法的更新公式为:

[ x_{n+1} = x_n - \frac{f'(x_n)}{f''(x_n)} ]

该方法利用函数的一阶导数和二阶导数信息,通过线性近似快速收敛到极值点。

实现牛顿迭代法的MATLAB步骤

定义目标函数及其导数
在MATLAB中,需要先定义目标函数 ( f(x) ) 及其一阶导数 ( f'(x) ) 和二阶导数 ( f''(x) )。例如,对于函数 ( f(x) = x^3 - 2x^2 + x ),代码如下:

syms x;
f = x^3 - 2*x^2 + x;       % 定义目标函数
df = diff(f, x);           % 一阶导数
d2f = diff(df, x);         % 二阶导数

初始化迭代参数
设置初始猜测值 ( x_0 )、迭代容忍误差 ( tol ) 和最大迭代次数 ( max_iter )。

x0 = 1.5;                  % 初始猜测值
tol = 1e-6;                % 容忍误差
max_iter = 100;            % 最大迭代次数

实现牛顿迭代循环
通过循环更新 ( x ) 的值,直到满足收敛条件或达到最大迭代次数。

for iter = 1:max_iter
    df_val = double(subs(df, x, x0));    % 计算一阶导数值
    d2f_val = double(subs(d2f, x, x0));  % 计算二阶导数值
    
    if abs(df_val) < tol                 % 检查收敛条件
        break;
    end
    
    x0 = x0 - df_val / d2f_val;          % 牛顿迭代更新
end

输出结果
显示最终的极值点和函数值。

fprintf('极值点: x = %.6f\n', x0);
fprintf('函数值: f(x) = %.6f\n', double(subs(f, x, x0)));

处理多变量函数的极值问题

对于多变量函数 ( f(\mathbf{x}) ),牛顿迭代法需要用到梯度和Hessian矩阵。更新公式为:

[ \mathbf{x}_{n+1} = \mathbf{x}_n - H^{-1}(\mathbf{x}_n) \nabla f(\mathbf{x}_n) ]

定义目标函数及其梯度与Hessian
以二元函数 ( f(x, y) = x^2 + y^2 + xy ) 为例:

syms x y;
f = x^2 + y^2 + x*y;        % 定义目标函数
grad_f = gradient(f);       % 梯度
hess_f = hessian(f);        % Hessian矩阵

初始化与迭代
设置初始点 ( \mathbf{x}_0 = [x_0, y_0] ),其余步骤与一元情况类似。

x0 = [1; 1];                % 初始猜测值
tol = 1e-6;
max_iter = 100;

for iter = 1:max_iter
    grad_val = double(subs(grad_f, {x, y}, {x0(1), x0(2)}));
    hess_val = double(subs(hess_f, {x, y}, {x0(1), x0(2)}));
    
    if norm(grad_val) < tol
        break;
    end
    
    x0 = x0 - inv(hess_val) * grad_val;  % 多变量牛顿更新
end

注意事项与优化建议

收敛性与初始值选择
牛顿迭代法的收敛性依赖于初始猜测值。若初始值远离极值点或Hessian矩阵非正定,可能导致发散。建议结合线搜索(如Armijo准则)改进稳定性。

数值稳定性
直接计算Hessian矩阵的逆可能不稳定,可使用MATLAB的 \ 运算符求解线性方程组:

x0 = x0 - hess_val \ grad_val;  % 更稳定的求解方式

符号计算与数值计算的平衡
对于复杂函数,符号计算可能效率较低。可在迭代前将符号表达式转换为匿名函数以提高速度:

f_func = matlabFunction(f, 'Vars', {x});
df_func = matlabFunction(df, 'Vars', {x});
d2f_func = matlabFunction(d2f, 'Vars', {x});

完整代码示例

以下是一元函数牛顿迭代法求极值的完整MATLAB代码:

syms x;
f = x^3 - 2*x^2 + x;
df = diff(f, x);
d2f = diff(df, x);

x0 = 1.5;
tol = 1e-6;
max_iter = 100;

for iter = 1:max_iter
    df_val = double(subs(df, x, x0));
    d2f_val = double(subs(d2f, x, x0));
    
    if abs(df_val) < tol
        break;
    end
    
    x0 = x0 - df_val / d2f_val;
end

fprintf('极值点: x = %.6f\n', x0);
fprintf('函数值: f(x) = %.6f\n', double(subs(f, x, x0)));

BbS.okacop010.info/PoSt/1120_063087.HtM
BbS.okacop011.info/PoSt/1120_188983.HtM
BbS.okacop012.info/PoSt/1120_270850.HtM
BbS.okacop013.info/PoSt/1120_758610.HtM
BbS.okacop014.info/PoSt/1120_243885.HtM
BbS.okacop015.info/PoSt/1120_105872.HtM
BbS.okacop016.info/PoSt/1120_139494.HtM
BbS.okacop017.info/PoSt/1120_172535.HtM
BbS.okacop018.info/PoSt/1120_436862.HtM
BbS.okacop019.info/PoSt/1120_543896.HtM
BbS.okacop010.info/PoSt/1120_088775.HtM
BbS.okacop011.info/PoSt/1120_866304.HtM
BbS.okacop012.info/PoSt/1120_809552.HtM
BbS.okacop013.info/PoSt/1120_246262.HtM
BbS.okacop014.info/PoSt/1120_297219.HtM
BbS.okacop015.info/PoSt/1120_835623.HtM
BbS.okacop016.info/PoSt/1120_972706.HtM
BbS.okacop017.info/PoSt/1120_244368.HtM
BbS.okacop018.info/PoSt/1120_065592.HtM
BbS.okacop019.info/PoSt/1120_317636.HtM
BbS.okacop010.info/PoSt/1120_172596.HtM
BbS.okacop011.info/PoSt/1120_923026.HtM
BbS.okacop012.info/PoSt/1120_155448.HtM
BbS.okacop013.info/PoSt/1120_006396.HtM
BbS.okacop014.info/PoSt/1120_114171.HtM
BbS.okacop015.info/PoSt/1120_881152.HtM
BbS.okacop016.info/PoSt/1120_985483.HtM
BbS.okacop017.info/PoSt/1120_144198.HtM
BbS.okacop018.info/PoSt/1120_876706.HtM
BbS.okacop019.info/PoSt/1120_001143.HtM
BbS.okacop010.info/PoSt/1120_317126.HtM
BbS.okacop011.info/PoSt/1120_382614.HtM
BbS.okacop012.info/PoSt/1120_339190.HtM
BbS.okacop013.info/PoSt/1120_150031.HtM
BbS.okacop014.info/PoSt/1120_709537.HtM
BbS.okacop015.info/PoSt/1120_750941.HtM
BbS.okacop016.info/PoSt/1120_185953.HtM
BbS.okacop017.info/PoSt/1120_540225.HtM
BbS.okacop018.info/PoSt/1120_383275.HtM
BbS.okacop019.info/PoSt/1120_163081.HtM
BbS.okacop010.info/PoSt/1120_623347.HtM
BbS.okacop011.info/PoSt/1120_847958.HtM
BbS.okacop012.info/PoSt/1120_902807.HtM
BbS.okacop013.info/PoSt/1120_880914.HtM
BbS.okacop014.info/PoSt/1120_313236.HtM
BbS.okacop015.info/PoSt/1120_829630.HtM
BbS.okacop016.info/PoSt/1120_219250.HtM
BbS.okacop017.info/PoSt/1120_583757.HtM
BbS.okacop018.info/PoSt/1120_543070.HtM
BbS.okacop019.info/PoSt/1120_513993.HtM
BbS.okacop010.info/PoSt/1120_825711.HtM
BbS.okacop011.info/PoSt/1120_456432.HtM
BbS.okacop012.info/PoSt/1120_367949.HtM
BbS.okacop013.info/PoSt/1120_916887.HtM
BbS.okacop014.info/PoSt/1120_703562.HtM
BbS.okacop015.info/PoSt/1120_951559.HtM
BbS.okacop016.info/PoSt/1120_944317.HtM
BbS.okacop017.info/PoSt/1120_234459.HtM
BbS.okacop018.info/PoSt/1120_919530.HtM
BbS.okacop019.info/PoSt/1120_312875.HtM
BbS.okacop010.info/PoSt/1120_987258.HtM
BbS.okacop011.info/PoSt/1120_780348.HtM
BbS.okacop012.info/PoSt/1120_957727.HtM
BbS.okacop013.info/PoSt/1120_396573.HtM
BbS.okacop014.info/PoSt/1120_562259.HtM
BbS.okacop015.info/PoSt/1120_979512.HtM
BbS.okacop016.info/PoSt/1120_989816.HtM
BbS.okacop017.info/PoSt/1120_221540.HtM
BbS.okacop018.info/PoSt/1120_079382.HtM
BbS.okacop019.info/PoSt/1120_057770.HtM
BbS.okacop010.info/PoSt/1120_614190.HtM
BbS.okacop011.info/PoSt/1120_064601.HtM
BbS.okacop012.info/PoSt/1120_474987.HtM
BbS.okacop013.info/PoSt/1120_454279.HtM
BbS.okacop014.info/PoSt/1120_991886.HtM
BbS.okacop015.info/PoSt/1120_888562.HtM
BbS.okacop016.info/PoSt/1120_548778.HtM
BbS.okacop017.info/PoSt/1120_424129.HtM
BbS.okacop018.info/PoSt/1120_297271.HtM
BbS.okacop019.info/PoSt/1120_093064.HtM

#牛客AI配图神器#

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 10:05
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务