0


hnu计算机与人工智能概论5.26(方程求根)

第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位小数输出该根值,并输出迭代次数。

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以及迭代次数。

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###################
标签: python

本文转载自: https://blog.csdn.net/howell55/article/details/130918137
版权归原作者 howell(Python) 所有, 如有侵权,请联系我们删除。

“hnu计算机与人工智能概论5.26(方程求根)”的评论:

还没有评论