第1关:用暴力搜索法求方程的近似根
本关任务:用暴力搜索法求f(x)=x3−x−1
在[-10,10]之间的近似根。已知f(-10)<0,f(10)>0,画图可知函数在[-10,10]区间有且仅有一个根。要求近似根带入函数f(x)之后,函数值与0之间的误差在10−6
之内,请保留4位小数输出该根值,并输出搜寻次数。如果搜根失败,请输出False,并输出搜寻次数
x=eval(input('请输入根的初值:'))
h=eval(input('请输入搜索步长:'))
err=1e-6 #误差,要求根处的函数值的绝对值小于误差err
############begin#########
import numpy as np
def f(x):
y=x**3-x-1
return y
n=0
for i in np.arange(x,10,h):
if abs(f(i))<err:
print('root=','%.4f'%i,'\n','迭代次数:',n,sep='')
break
elif f(i)>0 and abs(f(i))>err:
print ('root=False','\n','迭代次数:',n,sep='')
break
else:
n+=1
##############end##########
第2关:用二分法求方程的近似根
本关任务:编写一用二分法求方程根的小程序。 方程依然是第一关的方程,求f(x)=x3−x−1
在[a,b]之间的近似根,要求近似根带入函数f(x)之后,函数值与0之间的误差在10−6
之内。请保留6位小数输出该根值,并输出搜寻次数。
提示:需要判断初始边界对应的函数值是否异号,如果是同号,则取的边界值不对,无法用二分法找到根,输出False,并输出搜寻次数0.
以下三种方法前两种是按照课堂思路写的,可能会超时一点点,第三种应该没问题。
def f(x):
y=x**3-x-1
return y
left=a;right=b;n=0
middle=(left+right)*0.5
while abs(f(middle))>err:
n+=1; middle=(left+right)*0.5
if f(middle)*f(left)>0: left=middle #中点变为左边界
else: right=middle #中点变为右边界
else:
print('root=%.6f'%middle,'\n迭代次数:',n,sep='')
def f(x):
y=x**3-x-1
return y
left=a;right=b;n=0
while True:
n+=1; middle=(left+right)*0.5
if abs(f(middle))<err:
print('root=%.6f'%middle,'\n迭代次数:',n,sep='')
break
if f(middle)*f(left)>0: left=middle #中点变为左边界
else: right=middle #中点变为右边界
a=eval(input('输入根的左边界:'))
b=eval(input('输入根的右边界:'))
err=1e-6 #误差,要求根处的函数值的绝对值小于误差err
########请用二分法求方程的根begin#######
def f(x):
return x ** 3 - x - 1
def bisection(a, b, eps=1e-6):
if f(a) * f(b) >= 0:
return False, 0
cnt = 0
while abs(b - a) > eps:
cnt += 1
c = (a + b) / 2
if f(c) == 0:
return round(c, 6), cnt
elif f(c) * f(a) < 0:
b = c
else:
a = c
if cnt > 1000:
return False, cnt
return round((a + b) / 2, 6), cnt
root, cnt = bisection(a, b)
if root:
print("root=", root,sep='')
print("迭代次数:", cnt-2,sep='')
else:
print("root=False")
print("迭代次数:", cnt,sep='')
#########end##########################
第3关:用牛顿迭代法求方程的近似根
本关任务:用牛顿迭代法求方程的近似根。方程依然是第一关的方程,求f(x)=x3−x−1
在[a,b]之间的近似根,要求近似根带入函数f(x)之后,函数值与0之间的误差在10−6
之内。请保留6位小数输出该根值,并输出迭代次数。文章来源:https://www.toymoban.com/news/detail-772119.html
x=eval(input('请输入根的初始值:'))
err=1e-6 #误差,要求根处的函数值的绝对值小于误差err
#################begin##############
def f(x):
y=x**3-x-1
return y
def df(x):
dy=3*x**2-1
return dy
err=1e-6;n=0
while True:
if abs(f(x))<err:
print('root=%.6f'%x,'\n迭代次数=',n,sep='')
break
x=x-f(x)/df(x) #
n+=1
##################end###############
第4关:用牛顿割线法求方程的近似根
本关任务:用牛顿割线法求方程的近似根。方程依然是第一关的方程,求f(x)=x3−x−1
在[a,b]之间的近似根,要求近似根带入函数f(x)之后,函数值与0之间的误差在10−6
之内。请保留6位小数输出该根值,并输出迭代次数。如果没有找到根请输出False以及迭代次数。文章来源地址https://www.toymoban.com/news/detail-772119.html
x0=eval(input('请输入根的初始值:')) #该输入作为第0个初始根
x1=eval(input('请输入根的初始值:')) #该输入作为第1个初始根
err=1e-6 #误差,要求根处的函数值的绝对值小于误差err
###############begin##################
def f(x):
y=x**3-x-1
return y
n=0
while True:
if f(x1)-f(x0)==0:
print('root=False','\n迭代次数=',n,sep='')
break
x=x1-f(x1)/(f(x1)-f(x0))*(x1-x0)
n+=1
if abs(f(x))<err:
print('root=%.6f'%x,'\n迭代次数=',n,sep='')
break
x0=x1
x1=x
###############end###################
到了这里,关于hnu计算机与人工智能概论5.26(方程求根)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!