|
|
# -*- coding: utf-8 -*-
|
|
|
"""
|
|
|
Created on Tue Jun 8 17:19:05 2021
|
|
|
|
|
|
@author: hzh
|
|
|
"""
|
|
|
# 例2:求函数y=x2-10x-30 的最小值
|
|
|
# 绘图
|
|
|
import numpy as np
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
|
|
|
|
def f(x):
|
|
|
return x ** 2 - 10 * x - 30
|
|
|
|
|
|
|
|
|
x = np.arange(-10, 10, 0.1)
|
|
|
plt.plot(x, f(x))
|
|
|
plt.grid()
|
|
|
plt.show()
|
|
|
|
|
|
# 梯度下降法求函数最值
|
|
|
np.random.seed(3)
|
|
|
x = np.random.randn(1); # 10代表数据的维度
|
|
|
# print(x)
|
|
|
learning_rate = 0.1
|
|
|
err = 0.000001;
|
|
|
max_iters = 10000
|
|
|
|
|
|
|
|
|
def f(x):
|
|
|
return x ** 2 - 10 * x - 30
|
|
|
|
|
|
|
|
|
def df(x):
|
|
|
return 2 * x - 10
|
|
|
|
|
|
|
|
|
for i in range(max_iters):
|
|
|
print("第 %d 次迭代:x=%.8f y=%.8f" % (i, x, f(x)))
|
|
|
if abs(df(x)) < err:
|
|
|
break
|
|
|
x = x - df(x) * learning_rate # xk+1=xk- η* f’(xk) (迭代公式)
|
|
|
|
|
|
# 练习题1:求函数y=x2-8x-25的最小值
|
|
|
# 练习题2:
|
|
|
# 已知函数y=x+sqrt(2*R*x-x**2), R为大于0的常数,x的取值范围在[R,2*R]之间。
|
|
|
# 当R=10时,求该函数在x取值区间内函数的最大值。
|
|
|
# 绘图
|
|
|
|
|
|
# 梯度下降法求函数最大值
|
|
|
|
|
|
|
|
|
# 给定一个二元函数f(x,y)= - exp(x-y)*(x**2-2*y**2),
|
|
|
# 用梯度下降法求其在x<0,y<0范围上的极小值
|
|
|
|
|
|
x = -1;
|
|
|
y = -1
|
|
|
learning_rate = 0.1
|
|
|
err = 0.000001;
|
|
|
max_iters = 10000
|
|
|
|
|
|
|
|
|
def f(x, y):
|
|
|
return -np.exp(x - y) * (x ** 2 - 2 * y ** 2)
|
|
|
|
|
|
|
|
|
def dx(x, y):
|
|
|
return -(np.exp(x - y) * (2 * x) + (x ** 2 - 2 * y ** 2) * np.exp(x - y))
|
|
|
|
|
|
|
|
|
def dy(x, y):
|
|
|
return -(np.exp(x - y) * (-4 * y) + (x ** 2 - 2 * y ** 2) * np.exp(x - y) * (-1))
|
|
|
|
|
|
|
|
|
for t in range(max_iters):
|
|
|
if t % 100 == 0:
|
|
|
print("Iter %d, x=%.8f,y=%.8f,z=%.8f,dx=%.8f,dy=%.8f" % (t, x, y, f(x, y), dx(x, y), dy(x, y)))
|
|
|
if abs(dx(x, y)) < err and abs(dy(x, y)) < err:
|
|
|
print("Iter %d, x=%.8f,y=%.8f,z=%.8f,dx=%.8f,dy=%.8f" % (t, x, y, f(x, y), dx(x, y), dy(x, y)))
|
|
|
break
|
|
|
x = x - learning_rate * dx(x, y);
|
|
|
y = y - learning_rate * dy(x, y) # 迭代公式
|
|
|
|
|
|
'''#练习题:
|
|
|
二元函数f(x,y)=x3-y3+3x2+3y2-9x求最值
|
|
|
三元函数f(x,y,z)=x2+2y2+3z2+2x+4y-6z求最值
|
|
|
'''
|