☰
牛顿法与优化进阶_实战
2026/10/3 12:49:40 网站建设 项目流程

优化牛顿法

  • 优化牛顿法 <==> 对导数做牛顿求根
importnumpyasnpimportmatplotlib.pyplotasplt plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falseprint("success")

牛顿法与梯度下降

deff(x):return(x-3.0)**2+1deffp(x):return2*(x-3)deffpp(x):return2.0x0=0.0x_gd,x_nt=x0,x0 eta=0.15print("真值 x*= 3")print("步 | 梯度下降 | 牛顿法")foriinrange(8):x_gd=x_gd-eta*fp(x_gd)x_nt=x_nt-fp(x_nt)/fpp(x_nt)print(f'{i+1:2d}|{x_gd:.4f}|{x_nt:.2f}')

病态山谷时牛顿法和梯度下降

defpath_gd(xy,eta=0.08,steps=20):hist=[xy.copy()]for_inrange(steps):x,y=xy g=np.array([2.0*x,20.0*y])xy=xy-eta*g hist.append(xy.copy())returnnp.array(hist)defpath_nt(xy):returnnp.vstack([xy,np.zeros(2)])start=np.array([1.6,1.2])pg,pn=path_gd(start),path_nt(start)xs=np.linspace(-2.2,2.2,200)ys=np.linspace(-1.6,1.6,200)X,Y=np.meshgrid(xs,ys)Z=X**2+10*Y**2plt.figure(figsize=(8,5))plt.contour(X,Y,Z,levels=[0.3,1,3,6,12,20],colors='#64748b')plt.plot(pg[:,0],pg[:,1],'o-',color='#d97706',label='梯度下降20步')plt.plot(pn[:,0],pn[:,1],'s-',color='#16a34a',label="牛顿一步到位")plt.legend()plt.gca().set_aspect('equal')plt.title('病态山谷:牛顿一步到位,GD之字形')plt.xlabel('x')plt.ylabel('y')plt.grid(True,alpha=0.3)plt.show()print("GD终点",pg[-1],"牛顿终点",pn[-1])

defpath_gd_c(xy,c,eta=0.08,steps=15):hist=[xy.copy()]foriinrange(steps):x,y=xy g=np.array(2.0*x,20*c*y)xy=xy-eta*g hist.append(xy.copy())returnnp.array(hist)start=np.array([1.6,1.2])forcin[5.0,10.0,25.0]:p=path_gd_c(start,c)print(f'c={c:4.0f}GD 第15步 |y| ={abs(p[-1,1]):.3e}牛顿一步到位')

逆牛顿直觉

# 逆牛顿直觉 : 二阶找的是驻点不是极值deffp(x):returnx**3-xdefnewton(x,steps=6):hist=[x]for_inrange(steps):h=3*x*x-1ifabs(h)<1e-12:breakx=x-fp(x)/h hist.append(x)returnhistdefsecant(x0,x1,steps=6):hist=[x0,x1]for_inrange(steps):g0,g1=fp(x0),fp(x1)ifabs(g0-g1)<1e-12:breakx2=x1-g1*(x1-x0)/(g1-g0)x0,x1=x1,x2 hist.append(x1)returnhistprint("驻点应该接近 +-1 或者0 ")print('牛顿 x0=0.8:',[round(v,6)forvinnewton(0.8)])print('割线0.5,0.8:',[round(v,6)forvinsecant(0.5,0.8)])print('牛顿 x0=0.1:',[round(v,6)forvinnewton(0.1)],'<- k靠近0(极大)')

鞍点
xy_nt=np.array([1.2,0.8])g=np.array([2.0*xy_nt[0],2.0*xy_nt[1]])H=np.array([[2.0,0.0],[0.0,-2.0]])xy_nt_next=xy_nt-np.linalg.solve(H,g)print('牛顿一步:',xy_nt,'-->',xy_nt_next)

xy=np.array([1.2,0.8],dtype=float)print("GD eta =0.8")foriinrange(6):g=np.array([2.0*xy[0],-2.0*xy[1]])xy=xy-0.08*gprint(f' 第{i+1}步{xy}')

#MCS #Mathematics #Maths #Yibo #翊博 #翊博在这里 #菲尔兹奖 #yibohere

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询