全局优化搜索高次方程的解
高次方程的解
某高中自主招生试题的形式是 ( 3 x − 2 ) 4 + ( 3 x − 4 ) 4 = 16 (3x-2)^4+(3x-4)^4=16 (3x−2)4+(3x−4)4=16,从方程常数项观察得到方程具备两个分式解 4 3 \frac{4}{3} 34和 2 3 \frac{2}{3} 32,在一般的高次方程求解问题中,这类方程可能不具备易于观察得到的解,这里把函数构造成绝对值的形式,
∣ ( 3 x − 2 ) 4 + ( 3 x − 4 ) 4 − 16 ∣ = 0 |(3x-2)^4+(3x-4)^4-16|=0 ∣(3x−2)4+(3x−4)4−16∣=0
此时 x x x定义域到值域的最小值是0,也是方程的最小值,那么Python程序的目标函数设计为,
objective_function = lambda x: numpy.abs((3*x-2)**4 + (3*x-4)**4 - 16)
从方程的区间端点的值域,起始搜索区间定义为(-10, 10),程序代码如下,
import porgo
import numpyobjective_function = lambda x: numpy.abs((3*x-2)**4 + (3*x-4)**4 - 16)
bounds = [(-10, 10)]
# bounds = [(-10, 1.2)]test = porgo.glos(objective_function, bounds) # mutation=0.5, recombination=0.9test.rand_pop(40)
for i in range(6):test.train_gen(100)test.result()print('{} epoch, minimum {}, medium {}, maximum {}'.format(i, test.fit_mini, test.fit_medi, test.fit_maxi))
print(test.mini, test.fit_mini)
得到第一个解是1.33333333,也就是4/3,
0 epoch, minimum [[5.65592018e-12]], medium [[5.65592018e-12]], maximum [[5.65592018e-12]]
1 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
2 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
3 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
4 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
5 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
[[1.33333333]] [[0.]]
缩小搜索区间到bounds = [(-10, 1.2)],得到第二个解是2/3,
0 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
1 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
2 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
3 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
4 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
5 epoch, minimum [[0.]], medium [[0.]], maximum [[0.]]
[[0.66666667]] [[0.]]
修改搜索区间到bounds = [(1.4, 10)]或[(-10, 0.6)],均无最小值,bounds=[(0.7, 1.2)]也无最小值。这时可以得到 ( 3 x − 2 ) 4 + ( 3 x − 4 ) 4 − 16 (3x-2)^4+(3x-4)^4-16 (3x−2)4+(3x−4)4−16共有两个解,第一个解是4/3,第二个解是2/3,其他高次方程的解也可以通过绝对值函数把定义域到值域的关系映射到极值为0,这种做法是无梯度搜索最值的方法,也是无需代数运算和变换的数值解法。