HJ107 求解立方根 【python3】

文章介绍了两种不依赖库函数计算浮点数立方根的方法:牛顿迭代法和基于零点存在定理及区间套定理。牛顿迭代法通过迭代逼近立方根,而区间套定理方法则通过不断缩小区间找到立方根的近似值。两种方法都涉及到数值计算中的精度控制,并给出了相应的Python代码示例。

题目描述

计算一个浮点数的立方根,不使用库函数。
保留一位小数。

数据范围:∣val∣≤20|val| \le 20val20

输入描述

待求解参数,为double类型(一个实数)

输出描述

输出参数的立方根。保留一位小数。

代码&解释

牛顿迭代法

牛顿迭代法与泰勒定理相关,由泰勒定理,函数f(x)f(x)f(x)x0x_0x0附近的值可近似为f(x)=f(x0)+f′(x0)(x−x0)f(x)=f(x_0)+f'(x_0)(x-x_0)f(x)=f(x0)+f(x0)(xx0),由此可得若f(x)=0f(x)=0f(x)=0则有x=x0−f(x0)/f′(x0)x=x_0-f(x_0)/f'(x_0)x=x0f(x0)/f(x0)
以该式作为迭代公式,设置预期的精度则可以得到零点的近似值,即立方根的近似值

while True:
    try:
        n=float(input())
        e=0.0001 #精度
        x=n #初值3为输入值
        while abs(x*x*x-n)>e:
            x=x-(x*x*x-n)/(3*x*x)
        print('%.1f'%(x))
    except:
        break

零点存在定理&区间套定理

这个解法的基于的原理是数学分析里连续函数的零点存在定理,以及区间套定理。区间套定理的证明过程其实就是代码实现求解立方根的一个过程,而零点存在定理则是帮助确定我们做区间分割时的第一个区间。
先附上两个定理。来源:华师版本的数学分析教材

零点存在定理

若函数fff在闭区间[a,b][a,b][a,b]上连续且f(a)f(a)f(a)f(b)f(b)f(b)异号,则至少存在一点x0∈(a,b)x_0 \in (a,b)x0(a,b),使得f(x0)=0f(x_0)=0f(x0)=0

区间套定理

{[an,bn]}\{[a_n,b_n]\}{[an,bn]}是一个区间套,则在实数系中存在唯一的一点ξ\xiξ,使得ξ∈[an,bn]\xi \in[a_n,b_n]ξ[an,bn]n=1,2,...n=1,2,...n=1,2,...,即an≤ξ≤bna_n\leq\xi\leq b_nanξbn.

代码实现

由零点存在定理,可以先确定一个存在零点的区间。再由区间套定理,当这个区间足够小的时候,这个唯一的值ξ\xiξ就可以作为零点的近似值。
因此我们仿照区间套定理的证明,对区间套的第一个区间对半分,选取零点所在的那一半区间作为第二个区间,以此类推。当区间长度小于我们所设置的精度时,即得到所求。

# f(x)=x**3-n 
while True:
    try:
        n=float(input())
        e=0.0001 #精度
        x=n #初值3为输入值

        # 确定区间
        if abs(n)>1:
            # f(0)f(n)<0
            a,b=0,n
        elif 0<n<1:
            # f(0)f(1)<0
            a,b=0,1
        elif -1<n<0:
            # f(-1)f(0)<0
            a,b=-1,0
        
        if abs(n)==1 or n==0:
            print('%.1f'%(n))
        else:
            ans=(a+b)/2
            while abs(ans**3-n)>=e:
                if (ans**3-n)*(b**3-n)<0:
                    a=ans
                else:
                    b=ans
                ans=(a+b)/2
            print('%.1f'%(ans))
        
    except:
        break


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值