需求:求下列方程组,结果保留两位小数
解决的源代码:
import numpy as np
def format_number(num):
"""如果num为整数,则返回整数格式,否则返回保留两位小数的字符串"""
if num % 1 == 0:
return f"{int(num)}"
else:
return f"{num:.2f}"
def solve_and_print(example_no, equations, A, b):
"""解线性方程组,并打印结果"""
print(f"\n例子 {example_no}:")
print("方程组:")
for eq in equations:
print(eq)
try:
solution = np.linalg.solve(A, b)
x, y = solution[0], solution[1]
print(f"解: x = {format_number(x)}, y = {format_number(y)}")
except np.linalg.LinAlgError:
print("无解或有无穷多解")
# 存储所有方程组的信息
systems = [
{
"example_no": 1,
"equations": ["{ 2x + 3y = 8", " 4x - y = 6"],
"A": np.array([[2, 3], [4, -1]]),
"b": np.array([8, 6])
},
{
"example_no": 2,
"equations": ["{ x + 2y = 5", " 3x + 6y = 15"],
"A": np.array([[1, 2], [3, 6]]),
"b": np.array([5, 15])
},
{
"example_no": 3,
"equations": ["{ 3x - 2y = 7", " 2x + y = 4"],
"A": np.array([[3, -2], [2, 1]]),
"b": np.array([7, 4])
},
{
"example_no": 4,
"equations": ["{ 4x + 5y = 14", " 2x - 3y = -2"],
"A": np.array([[4, 5], [2, -3]]),
"b": np.array([14, -2])
},
{
"example_no": 5,
"equations": ["{ x - y = 1", " 2x + 3y = 12"],
"A": np.array([[1, -1], [2, 3]]),
"b": np.array([1, 12])
}
]
# 遍历各个方程组
for system in systems:
solve_and_print(system["example_no"], system["equations"], system["A"], system["b"])
代码解析
1. 数字格式化函数
def format_number(num):
"""如果num为整数,则返回整数格式,否则保留两位小数"""
if num % 1 == 0:
return f"{int(num)}"
else:
return f"{num:.2f}"
-
功能:自动判断数值是否为整数,返回不同格式的字符串。
-
示例:
format_number(3.0)
→"3"
,format_number(2.5)
→"2.50"
2. 解方程组与输出函数
import numpy as np
def solve_and_print(example_no, equations, A, b):
"""解线性方程组,并打印结果"""
print(f"\n例子 {example_no}:")
print("方程组:")
for eq in equations:
print(eq)
try:
solution = np.linalg.solve(A, b)
x, y = solution[0], solution[1]
print(f"解: x = {format_number(x)}, y = {format_number(y)}")
except np.linalg.LinAlgError:
print("无解或有无穷多解")
-
工作流程:
-
打印方程组信息
-
使用
np.linalg.solve
求解 -
格式化输出解或捕获异常(矩阵不可逆时)
-
实例演示
方程组定义
systems = [
{
"example_no": 1,
"equations": ["2x + 3y = 8", "4x - y = 6"],
"A": np.array([[2, 3], [4, -1]]),
"b": np.array([8, 6])
},
# 其他例子类似结构...
]
运行结果分析
例子1:唯一解
方程组:
2x + 3y = 8
4x - y = 6
解: x = 2, y = 2
-
数学验证:
-
行列式
|A| = 2*(-1) - 3*4 = -14 ≠ 0
-
解为
x=2
,y=2
-
例子2:无穷多解
方程组:
x + 2y = 5
3x + 6y = 15
无解或有无穷多解
-
数学分析:
-
第二个方程是第一个的3倍,方程组线性相关
-
解空间为
x = 5 - 2y
,y为任意实数
-
例子3:唯一解(浮点数)
方程组:
3x - 2y = 7
2x + y = 4
解: x = 1.80, y = 0.40
-
计算细节:
-
行列式
|A| = 3*1 - (-2)*2 = 7
-
解通过克莱姆法则计算得
x=1.8
,y=0.4
-
关键知识点
-
矩阵可逆性:
-
np.linalg.solve
要求系数矩阵A必须是方阵且行列式非零 -
不可逆时抛出
LinAlgError
-
-
数值稳定性:
-
浮点运算可能产生舍入误差
-
大矩阵需注意条件数(
np.linalg.cond(A)
)
-
-
扩展应用:
-
可扩展至n元方程组
-
结合
scipy.linalg
处理更复杂问题
-
最终输出结果: