方法1:梯度下降
令x=
a
\sqrt{a}
a,那么
x
2
=
a
x^2=a
x2=a,写成方程的形式就是
f
(
x
)
=
x
2
−
a
f(x)=x^2-a
f(x)=x2−a,问题就转化为求
f
(
x
)
=
0
f(x)=0
f(x)=0的解,怎么转化为用梯度下降求呢?因为梯度下降是求极值的问题,可以把
f
(
x
)
f(x)
f(x)看成是某个函数的导数,也就是
g
(
x
)
=
1
3
x
3
−
a
x
g(x)=\frac{1}{3}x^3-ax
g(x)=31x3−ax,下面就可以用梯度下降求
g
(
x
)
g(x)
g(x)的极值了。
过程:
x=5 #设一个初始值
f_current=(math.pow(x,3)+a*x)/3 #计算初始函数值
step=0.01
while abs(error)>=1e-5 #代表10的多少次方 1*(10的负5次方):
x=x-step*(x*x-a) #迭代求x
error=f_current-(math.pow(x,3)+a*x)/3
f_current=(math.pow(x,3)+a*x)/3
方法2:二分法
又称实根对分法。二分法本质上是一种区间迭代算法,在迭代过程中不断对隔根区间进行压缩,以区间中点逼近方程的根.它所涉及的理论是连续函数介值定理.
连续函数介值定理
设函数f(x)在区间a,b上连续,且f(a)f(b)<0,则方程f(x)=0在区间(a,b)内至少有一个根.
二分法的基本思想
对有根区间a,b逐次分半,首先计算区间a,b的中间点x0,然后分析可能出现的三种情况:
如果f(x0)f(a)<0,则f(x)在区间a,x0内有零点;
如果f(x0)f(b)<0,则f(x)在区间x0,b内有零点;
如果f(x0)=0,则x0是f(x)在区间a,b内所求零点.