第1關(guān):用暴力搜索法求方程的近似根?
本關(guān)任務(wù):用暴力搜索法求f(x)=x3?x?1
在[-10,10]之間的近似根。已知f(-10)<0,f(10)>0,畫(huà)圖可知函數(shù)在[-10,10]區(qū)間有且僅有一個(gè)根。要求近似根帶入函數(shù)f(x)之后,函數(shù)值與0之間的誤差在10?6
之內(nèi),請(qǐng)保留4位小數(shù)輸出該根值,并輸出搜尋次數(shù)。如果搜根失敗,請(qǐng)輸出False,并輸出搜尋次數(shù)
x=eval(input('請(qǐng)輸入根的初值:'))
h=eval(input('請(qǐng)輸入搜索步長(zhǎng):'))
err=1e-6 #誤差,要求根處的函數(shù)值的絕對(duì)值小于誤差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','迭代次數(shù):',n,sep='')
break
elif f(i)>0 and abs(f(i))>err:
print ('root=False','\n','迭代次數(shù):',n,sep='')
break
else:
n+=1
##############end##########
第2關(guān):用二分法求方程的近似根
本關(guān)任務(wù):編寫(xiě)一用二分法求方程根的小程序。 方程依然是第一關(guān)的方程,求f(x)=x3?x?1
在[a,b]之間的近似根,要求近似根帶入函數(shù)f(x)之后,函數(shù)值與0之間的誤差在10?6
之內(nèi)。請(qǐng)保留6位小數(shù)輸出該根值,并輸出搜尋次數(shù)。
提示:需要判斷初始邊界對(duì)應(yīng)的函數(shù)值是否異號(hào),如果是同號(hào),則取的邊界值不對(duì),無(wú)法用二分法找到根,輸出False,并輸出搜尋次數(shù)0.
以下三種方法前兩種是按照課堂思路寫(xiě)的,可能會(huì)超時(shí)一點(diǎn)點(diǎn),第三種應(yīng)該沒(méi)問(wèn)題。
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 #中點(diǎn)變?yōu)樽筮吔? else: right=middle #中點(diǎn)變?yōu)橛疫吔?else:
print('root=%.6f'%middle,'\n迭代次數(shù):',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迭代次數(shù):',n,sep='')
break
if f(middle)*f(left)>0: left=middle #中點(diǎn)變?yōu)樽筮吔? else: right=middle #中點(diǎn)變?yōu)橛疫吔?/code>
a=eval(input('輸入根的左邊界:'))
b=eval(input('輸入根的右邊界:'))
err=1e-6 #誤差,要求根處的函數(shù)值的絕對(duì)值小于誤差err
########請(qǐng)用二分法求方程的根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("迭代次數(shù):", cnt-2,sep='')
else:
print("root=False")
print("迭代次數(shù):", cnt,sep='')
#########end##########################
?第3關(guān):用牛頓迭代法求方程的近似根
本關(guān)任務(wù):用牛頓迭代法求方程的近似根。方程依然是第一關(guān)的方程,求f(x)=x3?x?1
在[a,b]之間的近似根,要求近似根帶入函數(shù)f(x)之后,函數(shù)值與0之間的誤差在10?6
之內(nèi)。請(qǐng)保留6位小數(shù)輸出該根值,并輸出迭代次數(shù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-772119.html
x=eval(input('請(qǐng)輸入根的初始值:'))
err=1e-6 #誤差,要求根處的函數(shù)值的絕對(duì)值小于誤差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迭代次數(shù)=',n,sep='')
break
x=x-f(x)/df(x) #
n+=1
##################end###############
第4關(guān):用牛頓割線法求方程的近似根
本關(guān)任務(wù):用牛頓割線法求方程的近似根。方程依然是第一關(guān)的方程,求f(x)=x3?x?1
在[a,b]之間的近似根,要求近似根帶入函數(shù)f(x)之后,函數(shù)值與0之間的誤差在10?6
之內(nèi)。請(qǐng)保留6位小數(shù)輸出該根值,并輸出迭代次數(shù)。如果沒(méi)有找到根請(qǐng)輸出False以及迭代次數(shù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-772119.html
x0=eval(input('請(qǐng)輸入根的初始值:')) #該輸入作為第0個(gè)初始根
x1=eval(input('請(qǐng)輸入根的初始值:')) #該輸入作為第1個(gè)初始根
err=1e-6 #誤差,要求根處的函數(shù)值的絕對(duì)值小于誤差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迭代次數(shù)=',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迭代次數(shù)=',n,sep='')
break
x0=x1
x1=x
###############end###################
到了這里,關(guān)于hnu計(jì)算機(jī)與人工智能概論5.26(方程求根)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!