牛顿迭代法求极值的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
查看6道真题和解析