Python注释版Newton法
- Newton法基本计算步骤如下:
- 算法特点
- Python开源代码
##定义待运算的目标函数,给他整成一元四次的类型,参数可自己通过键盘键入
##定义目标函数,全局没啥用,主要是方便导函数的调取
def face(x):
return a0*x**5+a1*x**4+b1*x**3+c1*x**2+d1*x+e1
##定义一阶及二阶导函数
def sympy_derivative():
x=symbols('x')
fx=face(x)
diff1=diff(fx,x) ##目标函数的一阶导函数
diff2=diff(diff1,x) ##目标函数的二阶导函数
return diff1,diff2
##定义每一次迭代返回的结果
def Iteration(i,x,dx,ddx,xb,error):
print("第",i, "次迭代")
print("x[{}]:{:.4f} dx[{}]:{:.4f} ddx[{}]:{:.4f} x[{}]:{:.4f} |dx[{}]-acu|:{:.4f}".format(i,x,i,dx,i,ddx,i+1,xb,i+1,error))
##
def Newton(x1,acu): #x1:初始点,acu:精度值
diff1,diff2=sympy_derivative() ##f(x)的一二阶导函数
dx=10000000000000000 ##初始化dxb值,使其进入循环序列
i=0 #迭代次数
x=x1
while dx>=acu :
dx=diff1.evalf(subs ={'x':x})
print(dx)
ddx=diff2.evalf(subs ={'x':x})
if ddx!=0 :
xb=x-dx/ddx
else:
print("Newton法不适合该函数")
dxb=diff1.evalf(subs ={'x':xb})
if dxb<acu :
print("迭代结束,迭代次数为:{}次,最优化极小点为:x={}".format(i,xb))
break
error=dxb-acu
i+=1
Iteration(i,x,dx,ddx,xb,error)
ddxb=diff2.evalf(subs ={'x':xb})
x=xb
dx=dxb
ddx=ddxb
xb=dxb=ddxb=0
else: print("迭代结束,迭代次数为:{}次,最优化极小点为:x={}".format(i,xb))
from sympy import *
'''
a0,a1,b1,c1,d1,e1=map(float,input("请依次输入函数各参数").split(' '))
acu=float(input("输入收敛精度:"))
'''
a0,a1,b1,c1,d1,e1=0,1,-4,-6,-16,4
print("目标函数为f(x)={}*x^5+{}*x^4+{}*x^3+{}*x^2+{}*x+{}".format(a0,a1,b1,c1,d1,e1))
#x1=float(input("初始点定义为:"))
x1=6
acu=0.01
Newton(x1,acu)
演示结果
下图为精度调整为0.0000000001时的运算结果,大家可以比对观看
注释:代码可以完整运行下来,其中函数参数、初始点大小以及精度都可以手动键盘输入,也可以在主函数里自行设定。代码中,有些部分可以进一步优化,大家可以自行修改。