工程数学实验三
所花时间:2小时
代码量:如下
博客量:本学期截至目前71篇
了解到的知识点:工程数学
实验三:Newton 法程序设计
一、实验目的
掌握 Hesse 矩阵的计算方法和 Newton 法的基本思想及其迭代步骤;学会运用 MATLAB 编程实现 常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
2、主要内容
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成 Newton 法(牛顿法)的 MATLAB 编程、调试;
(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优 值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
3、操作要点
(1)通过编程实现牛顿法;
(2)使用 MTALAB 调试程序,并将实验结果保存到文件中;
(3)撰写实验报告。
4、主要仪器设备
微机及 Matlab 软件
三、算法步骤、代码、及结果
1. 算法步骤
1) .给定目标函数 $f(x)$,初始点 $x_0$,终止准则 $\epsilon$ 和最大迭代次数 $N$。
2) .计算初始点的函数值 $f(x_0)$、一阶导数 $f^\prime(x_0)$ 和二阶导数 $f^{\prime\prime}(x_0)$。
3) .利用牛顿迭代公式计算下一个迭代点 $x_{k+1}$:
$$
x_{k+1} = x_k - \frac{f’(x_k)}{f’'(x_k)}
$$
4) .如果 $|f(x_{k+1})-f(x_k)|<\epsilon$ 或者 $k\geq N$,则停止迭代输出结果 $x_{k+1}$,否则返回第 2 步并将 $x_{k+1}$ 赋值给 $x_k$。
5) .返回结果。
2. 代码
代码一:
function [x, fval, iter] = newton_method(func, x0, tol, maxiter)
% Newton's method for unconstrained optimization
% Input:
% func - a function handle that represents the objective function. The function should
% handle a vector input and returns a scalar output.
% x0 - the initial point, a column vector.
% tol - the tolerance of termination.
% maxiter - the maximum allowed number of iterations.
% Output:
% x - the optimal point, a column vector.
% fval - the optimal value.
% iter - the number of iterations performed.
iter = 0;
x = x0;
fval = func(x);
while iter < maxiter
df = diff_c(func,x); % the gradient of the objective function
d2f = diff2_c(func,x); % the Hessian matrix of the objective function
pk = -d2f\df; % the Newton direction
x_new = x + pk;
fval_new = func(x_new);
if norm(fval_new-fval) < tol % the convergence test
x = x_new;
fval = fval_new;
iter = iter+1;
break;
end
x = x_new;
fval = fval_new;
iter = iter+1;
end
function df = diff_c(func,x) % a helper function to approximate the gradient
h = 1e-6;
n = length(x);
df = zeros(n,1);
for i = 1:n
e = zeros(n,1); e(i) = 1;
df(i) = (func(x+h*e)-func(x))/h;
end
function d2f = diff2_c(func,x) % a helper function to approximate the Hessian matrix
h = 1e-6;
n = length(x);
d2f = zeros(n,n);
for i = 1:n
e = zeros(n,1); e(i) = 1;
df1 = diff_c(func,x+h*e);
df2 = diff_c(func,x-h*e);
d2f(:,i) = (df1-df2)/(2*h);
end
代码二:
func = @(x) 100*(x(1)-x(2)^2)^2+(1-x(1))^2; % ¶¨ÒåÄ¿±êº¯Êý
x0 = [0; 0]; % É趨³õʼµã
tol = 1e-5; % É趨ÖÕÖ¹×¼Ôò
maxiter = 100; % É趨×î´óµü´ú´ÎÊý
[x, fval, iter] = newton_method(func, x0, tol, maxiter); % µ÷Óú¯Êý½øÐÐʵÀý¼ÆËã
fprintf('×îÓŽ⣺%.6f, %.6f \n×îÓÅÖµ£º%.6e \nµü´ú´ÎÊý£º%d \n', x(1), x(2), fval, iter)
3. 结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)