《Python数学编程》练习-day009:编写一个计算程序(4)[求解二次方程的根]

《Python数学编程》练习-day009:编写一个计算程序(4)[求解二次方程的根]

提示→《Python数学编程》练习系列往期笔记,如下 👇:

Day1:《Python数学编程》练习-day001:斐波那契序列
Day2:《Python数学编程》练习-day002:分数操作
Day3:《Python数学编程》练习-day003:基本数学运算
Day4:《Python书序编程》练习-day004:复数
Day5:《Python书序编程》练习-day005:数值输入
Day6:《Python书序编程》练习-day006:计算整数因子
Day7:《Python书序编程》练习-day007:生成乘法表
Day8:《Python书序编程》练习-day008:测量单位转换


提示:菜鸟一枚,此系列文主要是用于我自己的学习记录,如果能对您有帮助,我荣幸至极。


前言

今天这篇笔记,主要学习一下使用Python求解二次方程的根,不涉及到非常高深的内容。


提示:以下是本篇文章正文内容。

一、第四个数学计算程序:求解二次方程的根

二次方程的形式,下:
  a x 2 + b x + c = 0 \ ax^{2}+bx+c = 0  ax2+bx+c=0
对应的根公式:
x 1 = − b + b 2 − 4 a c 2 a (1) \tag{1}x_1=\frac{-b +\sqrt{b^{2}-4ac}}{2a} x1=2ab+b24ac (1)
x 1 = − b − b 2 − 4 a c 2 a (2) \tag{2}x_1=\frac{-b -\sqrt{b^{2}-4ac}}{2a} x1=2abb24ac (2)


(求解程序是是把上面求根的公式(1)、(2)进行代码化)。

二、程序

1.求解二次方程的根

代码如下:

def roots(a, b, c):
	# (b**2 - 4*a*c) ** 0.5,在x_1和x_2中重复出现,如果不进行赋值,则会重复写,使代码冗余
    D = (b**2 - 4*a*c) ** 0.5
    x_1 = (-b + D) / (2*a)
    x_2 = (-b - D) / (2*a)
    if x_1 == x_2:
        print('x1 = x2: {0}'.format(x_1))
    else:
        print('x1:{0}'.format(x_1))
        print('x2:{0}'.format(x_2))
    
if __name__ == '__main__':
    a = float(input('Enter a:'))
    b = float(input('Enter b:'))
    c = float(input('Enter c:'))
    roots(a, b, c)

求解例子:
  x 2 + 2 x + 1 = 0 \ x^{2}+2x+1 = 0  x2+2x+1=0
运行:

Enter a:1
Enter b:2
Enter c:1

结果:

>>> 
x1 = x2: -1.0
2.程序分析

这个程序主要主要用到的是:1)定义函数;2)if条件语句的反复运用,程序语法不难;3)把重复性的代码表达可以进行赋值。

总结

1.完成公式向程序语言的转化。
2.源代码上传到了资源。
3.重复代码进行赋值,减少重复。

### Python 循环结构示例代码 #### 吃桃问题 吃桃问题是经典的递推问题之一。假设第一天有若干个桃子,每天吃掉一半再多吃一个,直到第n天只剩下一个桃子。可以通过反向思维解决这个问题。 ```python def peach_problem(days): peaches = 1 for day in reversed(range(1, days)): peaches = (peaches + 1) * 2 return peaches days = int(input('请输入天数:')) print(f'最初共有 {peach_problem(days)} 个桃子') ``` 此段代码展示了如何利用`for`循环和逆序遍历解决问题[^1]。 #### 自由落体运动计算 对于自由落体运动的模拟可以基于物理公式\(h=\frac{1}{2}gt^2\)来进行时间步长迭代求解高度变化情况。 ```python g = 9.8 # 加速度常量 m/s&sup2; def free_fall(height_initial, time_step=0.1): t = 0 h = height_initial while h >= 0: v = g*t print(f'Time={t:.1f}s Height={h:.2f}m Velocity={v:.2f}m/s') t += time_step h -= 0.5*g*(time_step**2) height_initial = float(input('输入初始高度(meters): ')) free_fall(height_initial) ``` 上述例子说明了使用`while`循环配合物理学原理完成数值仿真过程[^2]。 #### 空心菱形图案绘制 为了创建空心菱形图形,需要分别处理上半部分与下半部分,并注意边界条件控制输出字符的位置。 ```python size = int(input('Enter the size of diamond: ')) # 上三角 for row in range(size): spaces = " " * abs((size//2)-row) stars = "*" if row == 0 or row == size-1 else "* " * ((min(row,size-row-1)*2)+1).strip() print(spaces + stars.center(((size*2)-1), " ")) # 下三角 for row in range(size-2,-1,-1): spaces = " " * abs((size//2)-row) stars = "*" if row == 0 or row == size-1 else "* " * ((min(row,size-row-1)*2)+1).strip() print(spaces + stars.center(((size*2)-1), " ")) ``` 这段脚本运用嵌套`if...else`语句结合字符串方法实现了动态调整星号位置的效果[^3]。 #### 求解高次方程 牛顿法是一种有效的近似求算法,适用于多项式和其他类型的连续可微分函数。 ```python from sympy import symbols, diff, solve x = symbols('x') def newton_method(func_str, initial_guess=-1., tolerance=1e-6, max_iterations=100): func = lambda x_val: eval(func_str.replace('^', '**'), {"__builtins__": None}, {'x': x_val}) deriv_func = lambda x_val: eval(str(diff(func_str.replace('^', '**'), x)), {"__builtins__": None}, {'x': x_val}) root_approximation = initial_guess iteration_count = 0 while abs(func(root_approximation)) > tolerance and iteration_count < max_iterations: try: root_approximation -= func(root_approximation)/deriv_func(root_approximation) except ZeroDivisionError as e: raise ValueError("Derivative was zero during Newton's method calculation.") iteration_count += 1 return round(float(root_approximation), ndigits=int(-log(tolerance))) equation_input = input('Input equation to find roots (use ^ for power): ') initial_value = float(input('Provide an initial guess value near expected solution: ')) tolerance_level = float(input('Set desired accuracy level (>0 & <1): ')) max_iter_num = int(input('Maximum number of iterations allowed: ')) try: result = newton_method(equation_input, initial_value, tolerance_level, max_iter_num) print(f'Solution found at approximately x ≈ {result}') except Exception as ex: print(ex) ``` 这里采用符号库SymPy辅助解析表达式并自动获取导数,从而简化了复杂运算逻辑的设计[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Z-Code

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

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

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

打赏作者

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

抵扣说明:

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

余额充值