龙空技术网

青少年 Python 编程与思维锻炼 Lesson1: 求解一元二次方程

匠心编程与AI 163

前言:

今天朋友们对“c语言二次函数求解”可能比较关怀,你们都需要知道一些“c语言二次函数求解”的相关知识。那么小编在网络上搜集了一些关于“c语言二次函数求解””的相关资讯,希望姐妹们能喜欢,各位老铁们一起来学习一下吧!

目的与意义

一元二次方程求解是初中常见而且非常重要的一个问题,如果学生 能够通过程序完成一元二次方程的求解,说明对一元二次方程的求解 真正的领悟与透彻。因为如果理解有偏差,那么,程序就不会正常运行了。 同时,由于在程序中考虑到各种异常情况,真正的做到了锻炼思维的目的, 同时又掌握了这个知识点。

开始编程函数参数如何设计?

教材上告诉我们一元二次方程是: , 其中 。可见函数的参数有3个,分别是 。所以我们定义函数如下:

def one_variable_quadratic_equation_1(a: float, b: float, c: float) -> Tuple[float]:    """    一元二次方程求解    :param a: x二次项系数    :param b: x一次项系数    :param c: 常数项    :return: x1, x2 两个根    """    pass
如何求解方程?

自然的会想到使用求根公式

那么,我们就用该求根方程来完成该函数的编写, 代码如下:

def one_variable_quadratic_equation_1(a: float, b: float, c: float) -> Tuple[float]:    """    一元二次方程求解    :param a: x二次项系数    :param b: x一次项系数    :param c: 常数项    :return: x1, x2 两个根    """    x1 = (-b + math.sqrt(math.pow(b, 2) - 4 * a * c)) / (2 * a)    x2 = (-b - math.sqrt(math.pow(b, 2) - 4 * a * c)) / (2 * a)    return x1, x2
演示我们的成果

完成了我们的一元二次方程求解程序,迫不及待的用在实际的方程运算中。我们先自我演示一下:

方程1

求解 , 运算结果:

x1: -1.0, x2: -1.0

非常不错,我们得到了正确的结果。

方程2

求解 , 运算结果:

x1: 1.0, x2: -3.0

非常不错,我们也得到了正确的结果。

方程3

求解 , 运算结果: ...

我们的程序崩溃了。为什么会这样?进行 debug... 奥,原来 求根公式中 必须 大于0。写程序的时候没有,考虑这种特殊情况。

我们重新修改我们的程序,判断 , 返回 None,表示没有根。新的程序如下:

def one_variable_quadratic_equation_3(a: float, b: float, c: float) -> Tuple[float]:    """    一元二次方程求解    :param a: x二次项系数    :param b: x一次项系数    :param c: 常数项    :return: x1, x2 两个根    """    delta = math.pow(b, 2) - 4 * a * c    if delta >= 0:        x1 = (-b + math.sqrt(delta)) / (2 * a)        x2 = (-b - math.sqrt(delta)) / (2 * a)    else:        x1 = None        x2 = None    return x1, x2

经过这个问题的修复,我们更增加了对一元二次方程求解的认知。继续我们的测试。

方程4

求解 , 也就是 , 运算结果: ...

奥,我们的程序又崩溃了。为什么会这样? 进行 debug ... 原来,我们忽视了 的情况了。 重新修复, 我们对 进行判断, 如果 , 我们依然一元二次方程求解; 当 , 则退化成一元一次方程求解,我们直接对一元一次方程求解编程即可。

新的代码如下:

def one_variable_quadratic_equation_4(a: float, b: float, c: float) -> Tuple[float]:    """    一元二次方程求解    :param a: x二次项系数    :param b: x一次项系数    :param c: 常数项    :return: x1, x2 两个根    """    if a != 0:        delta = math.pow(b, 2) - 4 * a * c        if delta >= 0:            x1 = (-b + math.sqrt(delta)) / (2 * a)            x2 = (-b - math.sqrt(delta)) / (2 * a)        else:            x1 = None            x2 = None    else:        x1 = x2 = -c/b    return x1, x2

经过对这个问题的修复,我们知道了一些特别细微的异常情况,就是要考虑 是否为 0 的情况,这也是考试中常考的点呀。

方程5

求解 , 也就是 , 运算结果: ...

奥,我们的程序又崩溃了。为什么会这样? 进行 debug ...

原来当进行一元一次求解的时候, 也会崩溃呀。我们继续进行修复,对 情况进行判断。

新的代码如下:

def one_variable_quadratic_equation_5(a: float, b: float, c: float) -> Tuple[float]:    """    一元二次方程求解    :param a: x二次项系数    :param b: x一次项系数    :param c: 常数项    :return: x1, x2 两个根    """    if a != 0:        delta = math.pow(b, 2) - 4 * a * c        if delta >= 0:            x1 = (-b + math.sqrt(delta)) / (2 * a)            x2 = (-b - math.sqrt(delta)) / (2 * a)        else:            x1 = None            x2 = None    else:        if b != 0:            x1 = x2 = -c/b        else:            x1 = x2 = None    return x1, x2

经过这个问题的修复,我们知道了更深层次的异常,原来 b 也可以等于 0 呀。

方程6

求解 , 也就是 , 运算结果: "方程没有解"

这? 这合适吗?思考下,现在方程的解应该是什么?答案是任意实数呀,而不是没有解。

我们重新修订程序,那问题又来了如何来表示任意实数呢?我们思考下,稍稍进行变通。我们对结果返回两个值,一个用来表示,解的类型,目前为止我们有: 无解,全体实数,有解;另外一个值用来表示具体的解是什么,而全体实数,由于第一个值已经表示全体实数了,所以第二个值我们随意给值就好了,就用 None 吧。

最后的程序:

def one_variable_quadratic_equation_6(a: float, b: float, c: float) -> Tuple[str, float, float]:    """    一元二次方程求解    :param a: x二次项系数    :param b: x一次项系数    :param c: 常数项    :return: x1, x2 两个根    """    code = "有根"    if a != 0:        delta = math.pow(b, 2) - 4 * a * c        if delta >= 0:            code = "有根"            x1 = (-b + math.sqrt(delta)) / (2 * a)            x2 = (-b - math.sqrt(delta)) / (2 * a)        else:            code = "无根"            x1 = None            x2 = None    else:        if b != 0:            code = "一个根"            x1 = -c/b            x2 = None        else:            if c != 0:                code = "无根"                x1 = x2 = None            else:                code = "全体实数"                x1 = x2 = None    return code, x1, x2
总结

经过逐步进阶,修订程序中的各种问题,我们不断锻炼的思维,也从根本上掌握了一元二次方程求解的各种问题。相信在考试中再遇到这些问题,就能从容面对,并且思维全面。

标签: #c语言二次函数求解