第一课作业:用梯度下降法求函数局部极大值
题目描述
采用matlab完成功能,借鉴了某位大神的代码:
http://blog.sina.com.cn/s/blog_824188eb0102weos.html
代码如下:
注意:由于这里求的是极大值,而用梯度下降法得到的是极小值,因此将原函数取负值,最后得到结果时再取相反数
这个代码中还存在问题,由于用了matlab中自带的subs()函数,因此相关变量的都变成了sym类型,因此无法根据判断v0的大小对坐标值做约束,可能随着输入的初始值的不同,输出的坐标值会出现不在[-5,0]区间的情况。目前能想到的解决方法是不用subs()函数,那么就无法用matlab自带的求偏导函数,只能自己输入偏导函数。
如果有其他能解决这个问题的方法,欢迎交流!
上述程序发现由于求解最优步长的过程过于复杂,内存不够,因此将最优步长改成了固定步长,另外为解决约束的问题,自己求解了偏导数输入,程序如下:
输入指令:>> Grad_m(-1,-2)
输出