代码还是有很多地方需要完善的,需要近一步的学习
import math
#使用梯度下降法求函数的最小值
# f = exp(X^2+(y-2)^2) 初始点为(1,1)
#设计函数
def function_one(x_input,y_input): # 函数的输入 x,y
f = math.exp(x_input**2 + (y_input-2)**2) # 算出f 的值
dx = 2*x_input*f # 算出 一阶x导数的值
dy = 2*(y_input-2)*f # 算出 一阶y导数的值
return f, dx, dy # 返回三个值
def main():
x = 1 #初始点
y = 1 #初始点
a = 0.05 # 设置步长
error = 0.000001 # 设置误差函数
f_old, dx, dy = function_one(x,y) # 算出初始的值
for i in range(100): # 开始循环 梯度下降 设置循环的次数
x -= a*dx
y -= a*dy
f_result, dx, dy = function_one(x,y) # 获得第一次计算的初始值
if abs(f_result - f_old) < error: # 下降的结果绝对值与误差进行比较 如果再允许范围内则终止
f_final = f_result
print("最小值为: %.5f, 循环次数: %d, 误差:%8f" % (f_final, i , abs(f_result - f_old)))
break
print("第 %d 次循环, 函数值为 %f" % (i, f_result))
f_old = f_result
if __name__ == '__main__':
main()
结果如下:
结果
网友评论