—编程用牛顿法解方程 x*e**x-1=0,初始点和终止准则等自行选择。
#---编程用牛顿法解方程 x*e**x-1=0,初始点和终止准则等自行选择。
import numpy as np
from numpy import sign
import sympy as sp
import easygui as g
#---------原始函数-------
def fun(x):
f=x*sp.exp(x)-1
#f=7*x**5-13*x**4-21*x**3-12*x**2+58*x+3
return f
m=0
#---------求导,并判断在区间内任选初值是否使牛顿法生成的数列收敛到区间内的解-----
def ds_judge(a,b,fun):
global m
x=sp.symbols("x")
ds1=fun(x).diff(x)
ds2=sp.diff(ds1,x)
ds1fza=float(ds1.evalf(subs={x:a})) #ds1fza---导数1赋值a 以下类推
ds1fzb=float(ds1.evalf(subs={x:b}))
ds2fza=float(ds2.evalf(subs={x:a}))
ds2fzb=float(ds2.evalf(subs={x:b}))
if (ds1fza * ds2fza) >0 and (ds1fzb * ds2fzb) >0 :
m=1
print("在[%f,%f]内任选的初值可以使牛顿法生成的数列收敛到区间内的解,是一个严格递减有下界的数列。"%(a,b))
elif (ds1fza * ds2fza) <0 and (ds1fzb * ds2fzb) <0 :
m=1
print("在[%f,%f]内任选的初值可以使牛顿法生成的数列收敛到区间内的解,是一个严格递减有上届的数列。"%(a,b))
else:
m=2
print("不能断定在[%f,%f]内任选的初值可以使牛顿法生成的数列收敛到区间内的解,可以考虑缩小定义域。"%(a,b))
#--------牛顿法函数定义--------------
def nd_method(a,b,x0,esp,fun,ds_judge):
"""
a0: return print("该区间内没有根,请重新换区间!")
ds_judge(a,b,fun)
if m==1:
flag=1
if m==2: return print("请重新更换区间!")
while flag:
n +=1
ds1=fun(x).diff(x)
ds1fz=float(ds1.evalf(subs={x:x0}))
y=x0-(fun(x0) / ds1fz)
if abs(y-x0)