Newton法求解一元多次函数极小点python代码

Python注释版Newton法

  1. Newton法基本计算步骤如下:
    在这里插入图片描述
  2. 算法特点
    在这里插入图片描述
  3. 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时的运算结果,大家可以比对观看
在这里插入图片描述

注释:代码可以完整运行下来,其中函数参数、初始点大小以及精度都可以手动键盘输入,也可以在主函数里自行设定。代码中,有些部分可以进一步优化,大家可以自行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值