求数组最大最小值的数值方法
给定一个数组 A = [ a i ] A = [a_i] A=[ai],求它的最大值或最小值,一般会用遍历查找或排序的方法,但其实可以直接用计算的方法求出数组的最大最小值。
m
a
x
(
A
)
=
lim
n
→
∞
a
1
n
+
⋯
+
a
N
n
n
max(A) = \lim_{n\rightarrow \infty}\sqrt[n]{a_1^n + \cdots + a_N^n}
max(A)=n→∞limna1n+⋯+aNn
m
a
x
(
A
)
=
lim
β
→
∞
1
β
log
(
e
β
a
1
+
⋯
+
e
β
a
N
)
m
i
n
(
A
)
=
lim
β
→
−
∞
1
β
log
(
e
β
a
1
+
⋯
+
e
β
a
N
)
max(A) =\lim_{\beta\rightarrow \infty}\frac{1}{\beta}\log \left(e^{\beta a_1}+\cdots +e^{\beta a_N} \right)\\ min(A) =\lim_{\beta\rightarrow -\infty} \frac{1}{\beta}\log \left(e^{\beta a_1}+\cdots +e^{\beta a_N} \right)
max(A)=β→∞limβ1log(eβa1+⋯+eβaN)min(A)=β→−∞limβ1log(eβa1+⋯+eβaN)
证明也很简单。
下面用程序来说明:
import numpy as np
def max1(A):
n = 100
return pow(np.sum(A**n),1/n)
def max2(A):
beta = 10
return np.log(np.sum(np.exp(beta*A)))/beta
A = np.array([i for i in range(10)])+0.001
print(A)
print(max1(A))
print(max2(A))
'''
[1.000e-03 1.001e+00 2.001e+00 3.001e+00 4.001e+00 5.001e+00 6.001e+00 7.001e+00 8.001e+00 9.001e+00]
9.001000691258799
9.001004540096037
'''
需要注意的是,这种近似方法容易出现数值溢出,使用时须谨慎