赞
踩
本关任务:用梯度下降法求函数的最小值,认为当函数导数的绝对值小于1e-6时为函数的最小值处。函数为: y=−sin(1/10∗x)−x1/3
,请保留6位小数输出函数最小值以及此时的x值以及迭代次数。 如果超出给定的最大迭代次数10000次,函数导数的绝对值依然大于等于1e-6,则输出False。 注意:x的初值以及学习率从键盘录入
- import math
- x=eval(input('请输入x的初值:'))
- lr=eval(input('请输入学习率:'))#学习率,
- precision=1e-6#设置收敛精度,f'(x)与0值的差异
- max_iters=10000#最大迭代次数
- ###################begin############
- def f(x): return -math.sin(x/10)-math.pow(x,1/3)
- def df(x): return -(1/10)*math.cos(x/10)-(1/3)*math.pow(x,(-2/3))
- for i in range(max_iters):
- x=x-df(x) * lr
- if abs(df(x)) <precision:
- print("x=%.6f"%x)
- print('最小值=%.6f'%f(x))
- print('迭代次数=',i+1,sep='')
- break
- else:
- print('False')
- ##################end#######################

本关任务:用梯度下降法求二元函数f(x,y)=x3−y3+3x2+3y2−9x的最小值。要求最小值处的函数偏导数值小于1e-6,设置最大迭代次数10000,如果迭代结束都没有达到精度要求,则输出False,否则以保留8位小数的方式输出最小值以及此时的x值和y值,以及迭代次数。
- import numpy as np
- seed1,seed2=eval(input('请输入随机数种子:'))
- lr=eval(input('请输入学习率:')) #lr是学习率
- np.random.seed(seed1)
- x=np.random.randn()#二元函数f(x,y)中,自变量x的初值
- np.random.seed(seed2)
- y=np.random.randn()#二元函数f(x,y)中,自变量y的初值
- err=1e-6 ##误差,要求最小值处的函数的两个偏导数的绝对值都小于误差err
- max_iters=10000 #最大迭代次数
- #请用梯度下降法求出给定二元函数f(x,y)的最值及相关信息
- ##################begin################
- import numpy as np
- def f(x,y):
- return x**3-y**3+3*(x**2)+3*(y**2)-9*x
- def dx(x,y):
- return 3*x**2+6*x-9
- def dy(x,y):
- return -3*y**2+6*y
- for t in range(max_iters):
- if abs(dx(x,y))<err and abs(dy(x,y))<err:
- print("迭代次数%d,x=%.8f,y=%.8f,f(x,y)=%.8f"%(t,x,y,f(x,y)))
- break
- x=x-lr*dx(x,y); y=y-lr*dy(x,y)
- else: print(False)

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。