From ffc9538777fb4405cdfa5933582abd74375c8fd9 Mon Sep 17 00:00:00 2001 From: hnu202110040108 Date: Wed, 22 Jun 2022 14:15:52 +0800 Subject: [PATCH] ADD file via upload --- 函数求最值上课学生代码.py | 88 ++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 函数求最值上课学生代码.py diff --git a/函数求最值上课学生代码.py b/函数求最值上课学生代码.py new file mode 100644 index 0000000..723d593 --- /dev/null +++ b/函数求最值上课学生代码.py @@ -0,0 +1,88 @@ +# -*- 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求最值 +'''