原理
泰勒公式
f(x)=∑∞n=0f(n)(x0)×1n!(x−x0)n
假设函数 f(x) 二次可微,则二次泰勒展开:
f(x)≈g(x)=f(xk)+f′(xk)(x−xk)+12f′′(xk)(x−xk)2
求函数 f(x) 极值可转化为求导函数为0,对 g(x) 求导并令其为0
f′(xk)+f′′(xk)(x−xk)=0
⇒xk+1=xk−f′(xk)f′′(xk)
由此得到迭代公式, xk+1 不断逼近极值,直到某一次导数小于某误差
步骤
- 确定初始点 x0 ,确定误差大小 e
- 计算
f′(xk) ,若它的绝对值小于 e 则停止迭代,xk 即为极值点 - 计算 f′′(xk) ,并根据迭代公式求得 xk+1
- 跳转至步骤2
代码实现
这里使用的函数: x3+2x2+3x+4
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def h(x):
return x * x * x + 2 * x * x + 3 * x + 4
def h1(x):
return 3 * x * x + 4 * x + 3
def h2(x):
return 6 * x + 4
if __name__ == "__main__":
# x的初始值
x_k = 0
# 误差大小
e = 0.0001
k = 1
y = 0
# 迭代次数
times = 10000
while k < times:
y = h(x_k)
# 计算f'
y1 = h1(x_k)
if abs(y1) <= e:
break
# 计算f''
y2 = h2(x_k)
x_k -= y1 / y2
k += 1
print("k = ", k)
print("x = ", x_k)
print("y = ", y)