python实现一元三次方程求根-二分法

今天我的一位学妹拿了一道编程题来问我,我当时没时间,然后她找了答案,叫我帮忙运行验证一下,我当时做了一些修改,觉得实现过程还不错,所以记录一下,分享出来学习学习。

题目:有形如 a x 3 + b x 2 + c x + d = 0 ax^3+bx^2+cx+d=0 ax3+bx2+cx+d=0这样一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100到100之间),且根与根之差的绝对值大于等于1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

提示:记方程 f ( x ) = 0 f(x)=0 f(x)=0,若存在2个实数 x 1 x_{1} x1 x 2 x_{2} x2,且 x 1 < x 2 x_{1} \lt x_{2} x1<x2, f ( x 1 ) × f ( x 2 ) < 0 f(x_{1})\times f(x_{2})<0 f(x1)×f(x2)<0,则在 ( x 1 , x 2 ) (x_{1},x_{2}) (x1,x2)之间一定有一个根。

输入格式

一行,4个实数a,b,c,d

输出格式

一行,3个实根,从小到大输出,并精确到小数点后2位。
输入:

1 -5 -4 20

输出:

-2.00 2.00 5.00

代码实现

本质上就是从-100开始,一个一个的尝试,尝试的方法是使用二分法,直到找到3个满足条件的根就可以终止了。知道了这个就可以尝试写出代码:

def func(x,n):
    a,b,c,d=int(n[0]),int(n[1]),int(n[2]),int(n[3])
    return (((a*x+b)*x)+c)*x+d

def solve(numbers):
    cnt=0
    for i in range(-100,100):
        l=i
        r=i+1
        x1=func(i,numbers)
        x2=func(i+1,numbers)
        if x1==0:
            print("{:.2f}".format(l),end=" ")
            cnt+=1
        if x1*x2<0 :#大前提:左边和右边都不为0
            while (r-l) >= 0.001:#精度为两位小数故取三位小数可以夹逼至(l、r)最相近就可以近似的看作l==r;故只打印r
                m=(l+r)/2
                if func(m,numbers)*func(r,numbers)<=0:
                    l=m
                else:
                    r=m
            print("{:.2f}".format(r),end=" ")
            cnt+=1
        if cnt == 3:
            break

if __name__=="__main__":
    numbers=input().split() 
    # numbers = '1 -5 -4 20'.split() 
    solve(numbers)

参考文献

[洛谷P1024]python一元三次方程求解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值