工程数学实验三

所花时间: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. 结果

 

posted @   南北啊  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
1 2 3
4
点击右上角即可分享
微信分享提示