实验三:Newton 法程序设计

一、实验目的

1、基本要求

掌握 Hesse 矩阵的计算方法和 Newton 法的基本思想及其迭代步骤;学会运用 MATLAB 编程实现

常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。

 

二、实验内容

(1)求解无约束优化问题:

(2)终止准则取

(3)完成 Newton 法(牛顿法)的 MATLAB 编程、调试;

(4)选取几个与实验二中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优 值、收敛速度(迭代次数)等方面进行比较);

(5)按照模板撰写实验报告,要求规范整洁。

3、操作要点

(1)通过编程实现牛顿法;

(2)使用 MTALAB 调试程序,并将实验结果保存到文件中;

(3)撰写实验报告

 

 

三、算法步骤、代码、及结果

   1. 算法步骤

0:确定终止误差e=(0~1),初始点x0,=(0~1),=(0,0.5),令k=0

1:计算gk=f(xk).若||gk||<=e,停算,输出xk作为最优解。否则,转步2

2:计算Gk=^2f(xk),并解出方程组:Gk*dk=-gk,解得dk,其中Gk在xk处要正定

3:求步长k=^mk,m的值从0开始

f(xk+ ^m*dk)<=f(xk)+*^m*gk'dk

mk=m,步长 k=^mk,若不满足上式,则m=m+1,直到满足上述不等式为止

4:令Xk+1=xk+ k*dk,k=k+1,转步1

2. 代码

 

复制代码
 1 1、牛顿法
 2 
 3 function [x,val,k] =dampnm(fun,gfun,Hess,x0)
 4 %功能:用阻尼牛顿法求解无约束问题minif(x)
 5 %dampnm是阻尼的意思
 6 %输入:fun,gfun,Hess分别是目标函数,梯度,二阶导数,x0是初始点
 7 %输出:x,val分别是近似极小点和近似最优值,k是迭代次数
 8 maxk=100;
 9 rho=0.55;
10 sigma=0.4;
11 k=0;
12 e=1e-5;%精度要求
13 while(k<maxk)
14     gk=feval(gfun,x0);
15     if(norm(gk)<=e),break;end
16     Gk=feval(Hess,x0);
17     dk=-Gk\gk;%右除,解方程Gk*dk=-gk
18     m=0;
19     mk=0;
20     while(m<20)
21         if(feval(fun,x0+rho^m*dk)<feval(fun,x0)+sigma*rho^m*gk'*dk);
22            mk=m;
23            break;
24         end
25        m=m+1;
26     end
27      x0=x0+dk*rho^m;
28      k=k+1;      
29 end
30 x=x0;
31 val=feval(fun,x0);
32 end
33 
34  2.目标函数
35 
36 function f= fun(x)
37 %目标函数
38 f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;
39 end
40 
41  3.目标函数梯度
42 
43 function  g=gfun(x)
44 %目标函数的梯度
45 g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-200*(x(1)^2-x(2))]';
46 end
47 
48 4.目标函数的Hess阵
49 
50 function f = Hess(x)
51 %n=length(x);
52 %f=zero(n,n);
53 f=[1200*x(1)^2-400*x(2)+2,-400*x(1);
54     -400*x(1),             200];
55 5.主函数
56 
57 %这个问题的精确值是x=(1,1)',f(x)=0;
58 clear all
59 clc
60 x0=[-1,1]';
61 [x,val,k]=dampnm('fun','gfun','Hess',x0);
62 
63 fprintf('初始点 (%g, %g)\n', x0(1), x0(2));
64 fprintf('迭代次数: %d\n', k);
65 fprintf('最优点: (%g, %g)\n', x(1), x(2));
66 disp(['最优函数值: f(x) = ',num2str(val)])
复制代码

 

posted @   旺旺大菠萝  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示