实验三: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)])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统