⽅程求根(⼆分法和⽜顿迭代法)⼀、实验内容
1. 以⽅程:x3-0.2x2-0.2x-1.2=0为例,编写程序求⽅程的根
2. 编写⼆分法、迭代法、⽜顿法程序,分析运⾏结果
⼆、代码(python)
import matplotlib.pyplot as plt
#计算原函数值
def compute_function_value(x):
return x**3-0.2*(x**2)-0.2*x-1.2
#计算迭代式的值
def compute_iteration_value(x):
return -0.05*(x**3)+0.01*(x**2)+1.01*x+0.06
#计算⽜顿迭代式的值
def compute_newton_iteration_value(x):
return x-(x**3-0.2*(x**2)-0.2*x-1.2)/(3*(x**2)-0.4*x-0.2)
#⽤零点定理判断区间是否有根
def zero_theorem(x1,x2):
r=(compute_function_value(x1)*compute_function_value(x2))
if(r<=0):
return True
else:
return False
'''
⼆分法
a:左区间
b:右区间
cache_x:缓存每次迭代的x值
epslion:精度
'''
def dichotomy(a,b,cache_x,epslion):
k=1
while((b-a)>=epslion or k==1):
mid=(a+b)/2.0
cache_x.append(mid)
if(compute_function_value(mid)*compute_function_value(b)<0):
a=mid
else:
b=mid
k=k+1
return mid
'''
迭代法
x0:初值
cache_x:缓存每次迭代的x值
epslion:精度
'''
def iterative_method(x0,cache_x,epslion):
cache_x.append(x0) #缓存初值
x1=compute_iteration_value(x0)  #计算迭代式的值并赋给x1
cache_x.append(x1) #缓存
#判断,不满⾜精度则循环
while(abs(x1-x0)>epslion):
x0=x1
x1=compute_iteration_value(x0)
cache_x.append(x1)
cache_x.append(x1)
return x1  #返回最后结果
#⽜顿迭代法
def newton_iterative_method(x0,cache_x,epslion):
cache_x.append(x0) #缓存初值
x1=compute_newton_iteration_value(x0)  #计算⽜顿迭代式的值并赋给x1
cache_x.append(x1) #缓存
#判断,不满⾜精度则循环
while(abs(x1-x0)>epslion):
x0=x1
x1=compute_newton_iteration_value(x0)
cache_x.append(x1)
return x1  #返回最后结果
#主控程序
def main():
cache_x=[]  #保存x的每次的值,以便绘图
a=float(input("Please enter the left interval a:"))  #输⼊左区间a
b=float(input("Please enter the left interval b:"))  #输⼊右区间b
#有根情况
if(zero_theorem(a,b)):
#选择菜单
choose=int(input("There are three methods now: \n\
1 : dichotomy\n\
2 : iterative_method\n\
3 : newton_iterative_method\nPlease choose one method(use number):"))
epslion=float(input("please enter the epslion:"))  #输⼊精度
#各种选择情况
if(choose==1):
x1=dichotomy(a,b,cache_x,epslion)
elif(choose==2):
x0=float(input("please enter the initial value x0:"))
x1=iterative_method(x0,cache_x,epslion)
else:
x0=float(input("please enter the initial value x0:"))
x1=newton_iterative_method(x0,cache_x,epslion)
#绘图
plt.plot(cache_x,'or')
plt.show()
print('approximate solutions:',x1)
else:    #⽆根情况
print('The equation has no root in the interval')
if __name__=='__main__':
main()
三、实验结果
同⼀精度(0.00000001)下:
迭代法程序运⾏结果:
同⼀精度(0.00000001)下,初值对迭代法的影响:
四、感悟
c语言牛顿迭代法求根1. ⽆论选那种⽅法,都要⾸先进⾏有根区间的判断。
2. 三者速度的⽐较(当精度要求为0.00000001时):⽜顿迭代法>⼆分法>迭代法
3. 迭代法中迭代式的选取⼀定要满⾜其求导后的绝对值在区间内恒⼩于1。
4. 当不好迭代式时,可以采⽤待定系数法来求迭代式,即如图:
5. 不同的初值对迭代法的影响⾮常⼤,如实验所⽰,当初值取为1.2时只要迭代⼀次,⽽取1.5时则迭代70多次。所以取初值时,可以采
⽤⼆分法取得⼀个好的初值,在迭代。
6. python在科学计算领域还是⽐较好⽤的,且matplotlib中的绘图⼯具能可视化的输出迭代结果,能更好的进⾏错误纠正及展⽰。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。