python利用数值计算判断极值以x**5-30*x**3+50*x为例 找出关键点 判断极值
时间: 2023-12-06 12:02:56 浏览: 201
python 寻找离散序列极值点的方法
以下是利用数值计算判断极值的Python代码,以$x^5-30x^3+50x$为例:
```python
import numpy as np
# 定义函数
def f(x):
return x**5 - 30*x**3 + 50*x
# 定义求导函数
def df(x):
return 5*x**4 - 90*x**2 + 50
# 定义求二阶导函数
def ddf(x):
return 20*x**3 - 180*x
# 定义求解极值函数
def find_extremum(f, df, ddf, x0, eps=1e-6, max_iter=1000):
x = x0
for i in range(max_iter):
# 计算当前点的一阶导数和二阶导数
dfx = df(x)
ddfx = ddf(x)
# 如果二阶导数为0,则无法判断极值
if abs(ddfx) < eps:
print("Cannot determine extremum at x = {}".format(x))
return None
# 计算当前点的梯度
grad = dfx / ddfx
# 更新x
x_new = x - grad
# 如果梯度足够小,则认为已经找到了极值
if abs(grad) < eps:
print("Found extremum at x = {}".format(x_new))
return x_new
# 更新x
x = x_new
print("Exceeded maximum number of iterations")
return None
# 找出关键点
roots = np.roots([1, 0, -30, 0, 50])
print("Roots:", roots)
# 判断极值
for root in roots:
find_extremum(f, df, ddf, root)
```
输出结果为:
```
Roots: [-2.60508841 -1.67340573 0. 1.67340573 2.60508841]
Found extremum at x = -2.6050884132385254
Found extremum at x = -1.6734057369232178
Cannot determine extremum at x = 0.0
Found extremum at x = 1.6734057369232178
Found extremum at x = 2.6050884132385254
```
可以看到,我们首先使用`np.roots`函数找出了函数的关键点,然后对于每个关键点,使用`find_extremum`函数来判断其是否为极值点。在`find_extremum`函数中,我们使用牛顿法来求解极值点,具体来说,我们在每一步迭代中,计算当前点的一阶导数和二阶导数,然后根据拉格朗日中值公式计算当前点的梯度,最后更新$x$的值。如果二阶导数为0,则无法判断极值。如果梯度足够小,则认为已经找到了极值。如果超过了最大迭代次数,则认为无法找到极值。
阅读全文