Python中一元二次方程在实数范围内的求解

概述

        在学习初中数学时,一元二次方程的计算是一项必备技能,可是常常有许多冗杂的数学题需要一个一个计算,非常的浪费时间,所以在下就以浅薄的数学知识和一些够不上台面的小技术制作了这个程序

程序预览

数学公式

在编写程序之前,我们需要明确一元二次方程在实数范围内的求解公式以及一些其它概念。

求解公式(又称为一元二次方程的求根公式):

x = \frac{-b\pm\sqrt{b^{2}-4ac}}{2a}

一般式:所有的一元二次方程都能化简为这个形式,其公式表达为:

ax^{2}+bx+c=0 (a\neq 0)

delta,是希腊字母,表示一元二次方程的根的判别式,表示为

\Delta =b^{2}-4ac

一元二次方程在实数范围内有两根x1和x2,两个根可能出现相等的情况。

环境搭建

使用环境:Python3.8

编辑器:pycharm

引用库:math

程序实现

导入库

        在该程序中为了简便(偷懒),我使用了math库,指令如下

import math

二次根式的化简

        这个部分参考了博主A123882的文章,对一些部分进行了细节上的改造,从而使结果更加简洁,感兴趣的朋友可以去看原文(文末有原文链接)

def QuadraticRange(QuadraticNumber):
    QuadraticList = []
    for i in range(1,QuadraticNumber + 1):
        QuadraticList.append(i*i)
    return QuadraticList

def SimpleastQuadraticRoot(number):
    if number >= 0:
        for i in QuadraticRange(int(number**0.5))[::-1]:
            if number / i == number // i:
                return int(i**0.5) , number // i
        return 0 , 0

def QuadraticRootFormat(QuadraticRoot):
    if QuadraticRoot[0] == 0:
        return 0
    if QuadraticRoot[0] == 1:
        return chr(8730) + str(QuadraticRoot[1])
    if QuadraticRoot[1] == 1:
        return QuadraticRoot[0]
    return str(QuadraticRoot[0]) + chr(8730) + str(QuadraticRoot[1])

参考文章的原文代码:

#逻辑代码
def QuadraticRange(QuadraticNumber):
    """返回输入数的的二次递归
    如输入4,返回[1, 4, 9, 16]"""
    QuadraticList = []
    for i in range(1,QuadraticNumber+1):
        QuadraticList.append(i*i)
    return QuadraticList
 
def SimplestQuadraticRoot(number):
    """最简二次根式化简,输入根号下的数字,返回元组(倍数,最简根)"""
    if number >= 0:
        for i in QuadraticRange(int(number**0.5))[::-1]:
            if number / i == number // i:
                return int(i**0.5) , number // i
        return 0 , 0
 
def QuadraticRootFormat(QuadraticRoot):
    """最简二次根式格式化输出"""
    if QuadraticRoot[0] == 0:
        return 0
    if QuadraticRoot[0] == 1:
        return '根号(' + str(QuadraticRoot[1]) + ')'
    if QuadraticRoot[1] == 1:
        return QuadraticRoot[0]
    return str(QuadraticRoot[0]) + '倍根号(' + str(QuadraticRoot[1]) + ')'
 
 
#输出
for i in range(100):
    QuadraticRoot = QuadraticRootFormat(SimplestQuadraticRoot(i))
    print('%-20.20s'%i + str(QuadraticRoot))

        在我的程序中,使用chr(8730)来代替了“倍根号”,原因是Python可以使用ASCII码来进行输出,此处不多做解释

主体程序

获得二次项系数,一次项系数,常数项

a = float(input('输入二次项系数:'))
b = float(input('输入一次项系数:'))
c = float(input('输入常数项:'))

        定义了a,b,c,三个变量存储二次项系数,一次项系数,常数项,同时带来了一个弊端:即在使用该程序时必须手动先将其化解为一元二次方程的一般式之后进行求解。

        input()函数用来获取值,但获取值是一个字符串类型的数据,所以我们需要将其化成能计算的数值型,而又考虑到输入可能是一个小数,所以采用float()函数。

计算delta

delta = b**2 - 4*a*c

首先计算delta,是为了判断该方程是否有实数根,即是否在实数范围内有解。

判断是否具有实数根

if delta < 0:
    print('该方程无实数根')
else:

判断delta是否是无理数

QuadraticRoot = QuadraticRootFormat(SimpleastQuadraticRoot(delta))
    z =str(QuadraticRoot)
    string = '√'
    for i in string:
        if i in z:

        使用变量QuadraticRoot来储存delta的二次根式化简结果,然后将其存为字符串,用一个循环代码判断化简结果里是否有根号。

有根号
        if i in z:
            x1 = ('-' + str(b) + '+' + z)
            x2 = ('-' + str(b) + '-' + z)
            m = str(2*int(a))
            print(' ' * (len('x1 =')) + x1)
            print('x1 =' + '-' * (len(x1) + 2))
            print(' ' * (len('x1 =') + ((len(x1) + 2 - len(m)) // 2)) + m)
            print(' ')
            print(' ' * (len('x2 =')) + x2)
            print('x2 =' + '-' * (len(x2) + 2))
            print(' ' * (len('x2 =') + ((len(x2) + 2 - len(m)) // 2)) + m)

        若化简式里有根号,那么就使用这一堆print()来输出结果(反正没有其他计算了不是?),当然这样会有一个弊端,计算完之后不一定是最简式。

无根号
        else:
            x1 = (-b + math.sqrt(delta)) / (2 * a)
            x2 = (-b - math.sqrt(delta)) / (2 * a)
            if x1 - int(x1) == 0 and x2 - int(x2) == 0:
                x1 = int(x1)
                x2 = int(x2)
                if x1 == x2:
                    print('x1=x2=', x1)
                else:
                    print('x1 =', x1)
                    print('x2 =', x2)
            else:
                if x1 == x2:
                    print('x1=x2=', x1)
                else:
                    print('x1 =', x1)
                    print('x2 =', x2)

        这个地方用math库里的math.sqrt()对delta开方然后计算,此处还有一个小判断:x1是否等于x2,等于就输出“x1 = x2 =”,不等于的话就输出单个的。

完整代码

import math
def QuadraticRange(QuadraticNumber):
    QuadraticList = []
    for i in range(1,QuadraticNumber + 1):
        QuadraticList.append(i*i)
    return QuadraticList

def SimpleastQuadraticRoot(number):
    if number >= 0:
        for i in QuadraticRange(int(number**0.5))[::-1]:
            if number / i == number // i:
                return int(i**0.5) , number // i
        return 0 , 0

def QuadraticRootFormat(QuadraticRoot):
    if QuadraticRoot[0] == 0:
        return 0
    if QuadraticRoot[0] == 1:
        return chr(8730) + str(QuadraticRoot[1])
    if QuadraticRoot[1] == 1:
        return QuadraticRoot[0]
    return str(QuadraticRoot[0]) + chr(8730) + str(QuadraticRoot[1])

a = float(input('输入二次项系数:'))
b = float(input('输入一次项系数:'))
c = float(input('输入常数项:'))

delta = b**2 - 4*a*c

if delta < 0:
    print('该方程无实数根')
else:
    QuadraticRoot = QuadraticRootFormat(SimpleastQuadraticRoot(delta))
    z =str(QuadraticRoot)
    string = '√'
    for i in string:
        if i in z:
            x1 = ('-' + str(b) + '+' + z)
            x2 = ('-' + str(b) + '-' + z)
            m = str(2*int(a))
            print(' ' * (len('x1 =')) + x1)
            print('x1 =' + '-' * (len(x1) + 2))
            print(' ' * (len('x1 =') + ((len(x1) + 2 - len(m)) // 2)) + m)
            print(' ')
            print(' ' * (len('x2 =')) + x2)
            print('x2 =' + '-' * (len(x2) + 2))
            print(' ' * (len('x2 =') + ((len(x2) + 2 - len(m)) // 2)) + m)
        else:
            x1 = (-b + math.sqrt(delta)) / (2 * a)
            x2 = (-b - math.sqrt(delta)) / (2 * a)
            if x1 - int(x1) == 0 and x2 - int(x2) == 0:
                x1 = int(x1)
                x2 = int(x2)
                if x1 == x2:
                    print('x1=x2=', x1)
                else:
                    print('x1 =', x1)
                    print('x2 =', x2)
            else:
                if x1 == x2:
                    print('x1=x2=', x1)
                else:
                    print('x1 =', x1)
                    print('x2 =', x2)

总结

        该程序属于小白时期做的一个简单程序,同时也有诸多弊端

弊端:

1.需要手动化简为一般形式

2.数字只支持输入整数和小数

3.结果不一定是最简式,需要再次手动化简

参考原文链接:Python最简二次根式化简,二次根式化简,纯python实现,不使用第三方库_二次根式的编程语言-CSDN博客

END THANKS

如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值