1python解方程
目标:Python快速入门-用解方程串联起其基础知识
- 串联方法:
- 建立一个知识容器
- 把知识放进容器
- 把容器的知识清空,然后把知识逐个装进容器。【让学习者更容易接受】
- 同样多的知识,有容器更容易传播。【手能拿的东西有限,若有一个容器则拿的更多】
- 知识容器:就是知识架构,其可以根据逻辑【自己的理解方式】,用思维导图等工具建立。
- 知识架构:串联知识的方式,一个完整的知识包含,是什么,为什么,怎么做。从会调库会用,到思考什么时候能用,为什么用,问题的本质到底是什么?
方法:Python实现求一元二次方程的解法
- 写代码,求解。
- 代码封装成函数,求解。
- 代码封装成类,求解。
- 添加异常处理,求解
- 代码封装成模块,求解。
- 安装第三方模块,求解。
- 如果这些开始不会写,但是通过网路检索,完成了那么你就算入门了。
- 发现问题,检索答案,验证,思考,总结。这些过程走一遍,能入门Python,也可入门其他。
三种方程的求解方法:
- 一元一次方程
- 二元一次方程
- 一元二次方程
1 一元一次方程
from sympy import symbols, Eq, solve
# 定义未知数
x = symbols('x')
# 定义方程
equation = Eq(2*x + 5, 11)
# 解方程
solution = solve(equation, x)
# 输出解
print("解为:", solution[0]) # 3
2 二元一次方程
from sympy import symbols, Eq, solve
# 定义未知数
x, y = symbols('x y')
# 定义线性方程组
equation1 = Eq(x + y, 8)
equation2 = Eq(x - y, 6)
# 解方程组
solution = solve((equation1, equation2), (x, y))
# 输出解
print("方程组的解为:", solution) # {x: 7, y: 1}
3 一元二次方程
**一元二次方程的标准形式:**其中a、b、c是已知的常数,x是未知数。
{ax^2+bx+c=0 \quad (a\ne 0)}。 \\为方便求解,我们将方程两边同时除以 a ,的一元二次方程
x^2+\frac{b}{a}x+\frac{c}{a}=0。 \\
二次方程的求根公式推导过程:
方程两边都加上一次项系数 \frac{b}{2a} 的平方,即方程两边都加上 \frac{b2}{4a2} 得
x2+\frac{b}{a}x+\frac{b2}{4a2}=\frac{b2}{4a^2}-\frac{c}{a}
(x+\frac{b}{2a})2=\frac{b2-4ac}{4a^2}
x+\frac{b}{2a}=±\frac{ \sqrt{b^2-4ac} }{2a}
x=\frac{-b±\sqrt{b^2-4ac}}{2a}
高中学过复数,数的范围扩大了,和初中求解一元二次方程的方法不同。
代码实现:sympy 模块求解
########################################################
#调用第三方模块的函数解一元二次方程
########################################################
import sympy as sp
# 示例:解方程 x^2 - 8x + 12 = 0
x = sp.symbols('x')
solution = sp.solve(x**2 - 8*x + 12, x)
print("Solutions:", solution) # Solutions: [2, 6]
代码实现:手动实现
########################################################
# 手动实现,解一元二次方程
########################################################
import math
# 解方程 x^2 - 8x + 12 = 0
a, b, c = 1, -8, 12
if a == 0:
print(f'您输入的不是二次方程!!!一次方程的解为x={c/b}')
else:
# 计算判别式(discriminant)
delta = b*b-4*a*c
if delta == 0:
# 有一个实根(重根)
x = -b/(2*a)
print(f'方程有两个相等的实数根:x={x}')
elif delta > 0:
# 有两个实根
x1 = (-b-math.sqrt(delta))/(2*a)
x2 = (-b+math.sqrt(delta))/(2*a)
print(f'方程有两个不同的实数根:x1={x1:.1f}, x2={x2:.2f}')
else:
# print(f'方程无解') # 一下的代码是高中之后的知识。
# delta < 0有两个虚根
real_part = -b / (2*a)
imaginary_part = math.sqrt(-delta) / (2*a)
x1 = complex(real_part, imaginary_part)
x2 = complex(real_part, -imaginary_part)
print(f'方程有两个不同的虚数根:x1={x1:.1f}, x2={x2:.2f}')
一元二次方程对应的函数
一元二次方程对应的函数
代码实现
########################################################
# 一元二次方程对应的函数
########################################################
import matplotlib.pyplot as plt
import numpy as np
import sympy as sp
# 1 准备数据 y=f(x)
x = np.linspace(-1, 9, 100) # 生成0到5之间的100个数据
a, b, c = 1, -8, 12
y = a * x ** 2 + b * x + c
# 2 绘制图形
plt.plot(x, y) # 画图
plt.axhline(0, color='black', linewidth=0.5) # 绘制竖线
plt.axvline(0, color='black', linewidth=0.5) # 绘制横线
plt.title("一元二次函数", fontproperties="SimHei",fontsize=18, fontweight='bold')
plt.grid()
plt.legend(["y = x**2 - 6*x + 8"], loc='upper right') # 添加图例
# 2绘制交点
# 解方程 x^2 - 8x + 12 = 0
x = sp.symbols('x')
y = a * x ** 2 + b * x + c
roots = sp.solve(y)
roots = np.array(roots)
# SymPy将符号表达式转换为Python函数
# 利用 lambdify 函数将 SymPy 表达式转换为 NumPy 可使用的函数
f = sp.lambdify(x, y, 'numpy')
# print(f(roots))
y_root = f(roots)
plt.scatter(roots, y_root, color='red', label="Roots")
# 3 显示
plt.show()
2基础知识
- 变量:定义变量
- 运算符:数学计算
- 数据类型:复数,整数
在Python中我们也要定义变量。我们可以把变量看成是一个未知数x,x = 5
代码实现
########################################################
# 手动实现,解一元二次方程
########################################################
import math
# 1 变量:定义变量;3数据类型--------------------------
# 解方程 x^2 - 8x + 12 = 0
a, b, c = 1, -8, 12
if a == 0:
print(f'您输入的不是二次方程!!!一次方程的解为x={c/b}')
else:
# 计算判别式(discriminant)
# 2 运算符:数学计算--------------------------
delta = b*b-4*a*c
if delta == 0:
# 有一个实根(重根)
x = -b/(2*a)
print(f'方程有两个相等的实数根:x={x}')
elif delta > 0:
# 有两个实根
x1 = (-b-math.sqrt(delta))/(2*a)
x2 = (-b+math.sqrt(delta))/(2*a)
print(f'方程有两个不同的实数根:x1={x1:.1f}, x2={x2:.2f}')
else:
# print(f'方程无解') # 一下的代码是高中之后的知识。
# delta < 0有两个虚根
real_part = -b / (2*a)
imaginary_part = math.sqrt(-delta) / (2*a)
# 3 数据类型:复数--------------------------
x1 = complex(real_part, imaginary_part)
x2 = complex(real_part, -imaginary_part)
print(f'方程有两个不同的虚数根:x1={x1:.1f}, x2={x2:.2f}')
3控制语句
**控制语句有三种,**顺序,判断,循环。
顺序语句:解一元二次方程,先求判别式 delta = b*b-4*a*c,再求根。
代码实现:判断语句
########################################################
# 手动实现,解一元二次方程
########################################################
import math
# 解方程 x^2 - 8x + 12 = 0
a, b, c = 1, -8, 12
if a == 0:
print(f'您输入的不是二次方程!!!一次方程的解为x={c/b}')
else:
# 计算判别式(discriminant)
delta = b*b-4*a*c
# 控制语句--------------------
if delta == 0:
# 有一个实根(重根)
x = -b/(2*a)
print(f'方程有两个相等的实数根:x={x}')
elif delta > 0:
# 有两个实根
x1 = (-b-math.sqrt(delta))/(2*a)
x2 = (-b+math.sqrt(delta))/(2*a)
print(f'方程有两个不同的实数根:x1={x1:.1f}, x2={x2:.2f}')
else:
# print(f'方程无解') # 一下的代码是高中之后的知识。
# delta < 0有两个虚根
real_part = -b / (2*a)
imaginary_part = math.sqrt(-delta) / (2*a)
x1 = complex(real_part, imaginary_part)
x2 = complex(real_part, -imaginary_part)
print(f'方程有两个不同的虚数根:x1={x1:.1f}, x2={x2:.2f}')
输出二次方程对应的二次函数的x, y
代码实现:循环语句
########################################################
# 输出二次函数对应的x, y
########################################################
def quadratic_equation(x, a, b, c):
"""定义二次函数
参数:未知数x,二次方程的系数a,b,c """
return a*x**2 + b*x + c
# 定义二次方程的系数
a = 1
b = -8
c = 12
# 循环语句--------------------
for x in range(10):
y = quadratic_equation(x, 1, -3, 2)
print(f"For x = {x}, y = {y}")
4函数
函数概述
**函数:**完成一个特定功能的一段代码。其类似于数学中的函数。函数分为三类:
- 内置函数
- 模块中的函数(内置模块和第三方模块)
- 自定义函数
1内置函数
内置函数,可以直接使用,如print,常用内置函数如下:
########################################################
# 内置函数运算操作
########################################################
list_data = [1, 2, 3, 4, 5, 66, 7, 8, 9, 10]
print(sum(list_data))
print(min(list_data))
print(max(list_data))
print(len(list_data))
print(pow(3, 2))
2内置模块中的函数
########################################################
# 内置模块运算操作
########################################################
import math
print(dir(math)) # 查看模块中的所有函数
print(help(math.pow)) # 查看模块中函数的的使用
print(math.pow(-5, 2)) # 平方函数 (-5)**2=25
print(math.pi) # 模块中的数据 pi,3.1415
print(math.sqrt(25)) # 开方函数
3自定义函数
定义解一元二次方程的函数
########################################################
# 自定义函数,解一元二次方程
########################################################
import math
def solve_equation(a, b, c):
''' 解二元一次方程的函数 '''
if a == 0:
print(f'您输入的不是二次方程!!!一次方程的解为x={c/b}')
else:
# 计算判别式(discriminant)
delta = b*b-4*a*c
if delta == 0:
# 有一个实根(重根)
x = -b/(2*a)
print(f'方程有两个相等的实数根:x={x}')
return x
elif delta > 0:
# 有两个实根
x1 = (-b-math.sqrt(delta))/(2*a)
x2 = (-b+math.sqrt(delta))/(2*a)
print(f'方程有两个不同的实数根:x1={x1:.1f}, x2={x2:.2f}')
return x1, x2
else:
# print(f'方程无解') # 一下的代码是高中之后的知识。
# delta < 0有两个虚根
real_part = -b / (2*a)
imaginary_part = math.sqrt(-delta) / (2*a)
x1 = complex(real_part, imaginary_part)
x2 = complex(real_part, -imaginary_part)
print(f'方程有两个不同的虚数根:x1={x1:.1f}, x2={x2:.2f}')
solve_equation(0, -2, 6) # 您输入的不是二次方程!一次方程的解为,x=-3.0
solve_equation(1, -2, 1) # 方程有两个相等的实数根:x=1.0
solve_equation(1, -8, 12) # 方程有两个不同的实数根:x1=2.0, x2=6.00
solve_equation(1, -2, 2) # 方程有两个不同的虚数根:x1=1.0+1.0j, x2=1.00-1.00j
代码实现:第三方模块sympy 模块求解
########################################################
#调用第三方模块的函数解一元二次方程
########################################################
import sympy as sp
# 解方程 x^2 - 8x + 12 = 0
x = sp.symbols('x')
solution = sp.solve(x**2 - 8*x + 12, x)
print("Solutions:", solution) # Solutions: [2, 6]
5面向对象
面向对象编程提供模块化和可维护的代码结构
- 属性和方法的定义
- 面向对象的特性:封装继承多态
- 面向对象和面向过程的区别
1 属性和方法的定义
- 属性:放在类里面的变量
- 方法:放在类里面的函数
2 面向对象的特性:封装继承多态
- 封装:将数据和操作封装在一个类中。在这个例子中,我们将封装一元二次方程的求解方法。
- 继承:一个类继承另一个类的特征。创建一个基类,并在子类中重写求解方法,实现多态。
- 多态:使用具有相同名称但不同实现的方法。在这里,将演示不同的求解方法
代码实现:简单版,封装
import math
class QuadraticEquation:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def solve(self):
delta = self.b ** 2 - 4 * self.a * self.c
if delta > 0:
x1 = (-self.b + math.sqrt(delta)) / (2 * self.a)
x2 = (-self.b - math.sqrt(delta)) / (2 * self.a)
print(f'方程有两个不同的实数根:x1={x1:.1f}, x2={x2:.2f}')
return x1, x2
elif delta == 0:
x = -self.b / (2 * self.a)
print(f'方程有两个相等的实数根:x={x}')
return x
else:
# print(f'方程无解') # 一下的代码是高中之后的知识。
# delta < 0有两个虚根
real_part = -self.b / (2 * self.a)
imaginary_part = math.sqrt(-delta) / (2 * self.a)
x1 = complex(real_part, imaginary_part)
x2 = complex(real_part, -imaginary_part)
print(f'方程有两个不同的虚数根:x1={x1:.1f}, x2={x2:.2f}')
return x1, x2
# 使用这个类来解方程 a = 1, b = -8, c = 12
equation_solver = QuadraticEquation(1, -8, 12)
roots = equation_solver.solve()
print("方程的根是:", roots)
代码实现:封装继承多态
import math
class Equation:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def solve(self):
pass
class QuadraticEquation(Equation):
def solve(self):
delta = self.b ** 2 - 4 * self.a * self.c
if delta > 0:
x1 = (-self.b + math.sqrt(delta)) / (2 * self.a)
x2 = (-self.b - math.sqrt(delta)) / (2 * self.a)
print(f'方程有两个不同的实数根:x1={x1:.1f}, x2={x2:.2f}')
return x1, x2
elif delta == 0:
x = -self.b / (2 * self.a)
print(f'方程有两个相等的实数根:x={x}')
return x
else:
# print(f'方程无解') # 一下的代码是高中之后的知识。
# delta < 0有两个虚根
real_part = -self.b / (2 * self.a)
imaginary_part = math.sqrt(-delta) / (2 * self.a)
x1 = complex(real_part, imaginary_part)
x2 = complex(real_part, -imaginary_part)
print(f'方程有两个不同的虚数根:x1={x1:.1f}, x2={x2:.2f}')
return x1, x2
class LinearEquation(Equation):
def solve(self):
if self.b == 0:
if self.c == 0:
print("无穷多解")
return "无穷多解"
else:
print("无解")
return "无解"
else:
print(f'一次方程的解为x={-self.c / self.b}')
return -self.c / self.b
# 使用这个类来解方程 x^2 - 8x + 12 = 0
equation_solver = QuadraticEquation(1, -8, 12)
roots = equation_solver.solve()
print("一元二次方程的根:", roots)
# 使用这个类来解方程 - 8x + 12 = 0
linear_solver = LinearEquation(0, -8, 12)
root = linear_solver.solve()
print("一元一次方程的根:", root)
6文件操作
内容概述
- 文件读写的两种模型
- with语句
1 文件读写的两种模型
- **文件不存在:**1新建文件,2写入信息,3关闭保存文件
- 文件存在:1打开文件,2读取信息, 3关闭文件
- **open() 函数:**常用形式是接收两个参数文件名(file)和模式(mode)
- r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
- w,只写模式【不可读;不存在则创建**;存在则清空内容**】
- a,只读追加写模式【不可读;不存在则创建;存在则只追加内容】
- + 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- a+, 写读【可读,可写】
为了方便演示,这里用了w,只写模式;为了文件的安全,最好修改成a,只读追加写模式。
#############################################
# 读写的两种操作模型
#############################################
# 文件不存在 1新建文件,2写入信息、3关闭保存文件
# 1 创建文件
data_file = open('love_study.txt', 'w')
str1 = "love makes the world go round! "
str2 = "good good study day day up! "
# 2 写入文件
line = data_file.write(str1)
line = data_file.write(str2) #写入文件
# 3 关闭保存文件
data_file.close()
# 文件存在 1打开文件,2读取信息, 3关闭文件
# 1 打开文件
fo = open("love_study.txt", "r") #读取文件
# 2 读取文件
line = fo.read()
print ("读取的字符串: %s" % (line))
# 3 关闭文件
fo.close()
2 with语句
- with语句使代码更清晰、更具可读性, 它简化了文件读写的流程;
- with关键字系统会自动调用 f.close() 方法;
########################################################
#调用第三方模块的函数解一元二次方程,并保存到文件中
########################################################
import sympy as sp
# 示例:解方程 x^2 - 8x + 12 = 0
x = sp.symbols('x')
roots = sp.solve(x**2 - 8*x + 12, x)
print("Roots:", roots) # Solutions: [2, 6]
# 保存数据到文件
with open("quadratic_roots.txt", "w") as file:
if isinstance(roots, tuple):
file.write(f"Root 1: {roots[0]}\nRoot 2: {roots[1]}")
else:
file.write(f"Root: {roots}")
# 从文件中读取数据
# 1 打开文件
fo = open("quadratic_roots.txt", "r") #读取文件
# 2 读取文件
line = fo.read()
print ("读取的字符串: %s" % (line))
# 3 关闭文件
fo.close()
7异常处理
使用try-except语句处理潜在的错误或异常情况
异常处理概述:
- 三种错误
- 异常处理
1三种错误
- 语法错误,比如少写了一个引号。指开发人员编写了不符合Python语法的代码所引起的错误。
- 运行时错误,比如用一个数去除以零。代码运行期间发生的错误称为异常或运行时错误。
- 逻辑错误,比如相等符号写成了赋值符号。逻辑错误发生时程序会顺利运行,但得到的结果不符合期望。
- 常见的错误
- IndentationError:缩进错误
- SyntaxError:语法错误
- invalid character in identifier:可能输入中文符号。
2异常处理
异常处理概述:处理可能出错的代码,增加程序的健壮性
########################################################
# 除法函数的异常处理操作
########################################################
def divide(x, y):
'''除法'''
try:
print("1可能发生异常的代码")
result = x / y
except ZeroDivisionError as err:#
print("2发生异常时执行的代码")
print('2发生异常时执行的代码,异常是', err)
except:
print("2发生异常时执行的代码,发生未知错误")
else:
print("3没有发生异常执行的代码!")
finally:
print("4非必需代码,不管是否有异常都会执行!")
print("我是正常代码!")
divide(2, 1)
print("------------------")
divide(2, 0)
print("------------------")
divide(2, 'a')
代码实现:求一元二次方程的根,添加异常处理
########################################################
# 自定义函数,解一元二次方程,添加异常处理
########################################################
import math
def solve_equation(a, b, c):
try:
if a == 0:
print(f'您输入的不是二次方程!!!一次方程的解为x={c/b}')
else:
# 计算判别式(discriminant)
delta = b*b-4*a*c
if delta == 0:
# 有一个实根(重根)
x = -b/(2*a)
print(f'方程有两个相等的实数根:x={x}')
return x
elif delta > 0:
# 有两个实根
x1 = (-b-math.sqrt(delta))/(2*a)
x2 = (-b+math.sqrt(delta))/(2*a)
print(f'方程有两个不同的实数根:x1={x1:.1f}, x2={x2:.2f}')
return x1, x2
else:
# print(f'方程无解') # 一下的代码是高中之后的知识。
# delta < 0有两个虚根
real_part = -b / (2*a)
imaginary_part = math.sqrt(-delta) / (2*a)
x1 = complex(real_part, imaginary_part)
x2 = complex(real_part, -imaginary_part)
print(f'方程有两个不同的虚数根:x1={x1:.1f}, x2={x2:.2f}')
except TypeError as e:
print(f"发生错误:{e}")
solve_equation(0, -2, 6) # 您输入的不是二次方程!一次方程的解为,x=-3.0
solve_equation(1, -2, 1) # 方程有两个相等的实数根:x=1.0
solve_equation(1, -8, 12) # 方程有两个不同的实数根:x1=2.0, x2=6.00
solve_equation(1, -2, 2) # 方程有两个不同的虚数根:x1=1.0+1.0j, x2=1.00-1.00j
# 输入的a不是数字时,报错
solve_equation("a", -3, 2)
8模块
通过模块化代码提高可重用性和可维护性
模块概述,若用模块和手机做对比,手机安装软件,可以实现更多功能,python安装模块,也可以。
- 内置模块,类似于手机自带软件,闹钟,电话**(功能有限只能打电话);需要引用,才能使用。**
- 第三方模块,类似于手机需安装的软件,微信(文字,语音,视频都可以);需要安装+引用,才能使用。
- 自定义模块,类似于自定义功能(自定义闹钟:闹钟+闹钟音乐为自己的录音“再睡一会再睡一会”);需要引用,才能使用。
1 内置模块
使用方式:参考第四章函数中,内置模块中的函数。
2 第三方模块
sympy.solve()函数解一元二次方程 ax^{2}+bx+c=0的根
########################################################
#调用第三方模块的函数解一元二次方程
########################################################
import sympy
x = sympy.Symbol('x')
a = 1
b = -8
c = 12
slove = sympy.solve(a*x**2 + b*x + c)
print(slove)
3 自定义模块
my_module.py文件就是一个模块,你可以在里面自定义数据,函数,类
在文件中定义一个模块
文件名:my_module.py
def solve_equation(a, b, c):
pass
在其他地方使用模块
from my_module import solve_equation
result = solve_equation(0, -2, 6)
9总结与参考
时间:2023年11月17日17:47:20
编程的本质:数据和函数
- 变量+运算符+控制语句–》函数–》类–》模块
- 变量存储数据
- 数据:字符,数字,文本,图片,音频,视频。
Python实现求一元二次方程的解法
- 写代码,求解。
- 代码封装成函数,求解。
- 代码封装成类,求解。
- 添加异常处理,求解
- 代码封装成模块,求解。
- 安装第三方模块,求解。