titicacine commited on
Commit
68f6b9e
·
verified ·
1 Parent(s): 8c5c24b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +103 -0
app.py CHANGED
@@ -33,6 +33,109 @@ def get_current_time_in_timezone(timezone: str) -> str:
33
  except Exception as e:
34
  return f"Error fetching time for timezone '{timezone}': {str(e)}"
35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  final_answer = FinalAnswerTool()
38
 
 
33
  except Exception as e:
34
  return f"Error fetching time for timezone '{timezone}': {str(e)}"
35
 
36
+ import numpy as np
37
+
38
+ @tool
39
+ def matrix_multiplication(matrix_a: list[list[float]], matrix_b: list[list[float]]) -> list[list[float]]:
40
+ """计算两个矩阵的乘积。
41
+
42
+ 此工具接受两个矩阵(表示为浮点数列表的列表)作为输入,并返回它们的乘积。
43
+ 它要求矩阵是有效的乘法(即,第一个矩阵的列数必须等于第二个矩阵的行数)。
44
+
45
+ Args:
46
+ matrix_a: 第一个矩阵,表示为浮点数列表的列表。
47
+ matrix_b: 第二个矩阵,表示为浮点数列表的列表。
48
+ """
49
+ try:
50
+ # 将列表的列表转换为 numpy 数组以实现高效的矩阵乘法
51
+ np_matrix_a = np.array(matrix_a)
52
+ np_matrix_b = np.array(matrix_b)
53
+
54
+ # 执行矩阵乘法
55
+ result_matrix = np.matmul(np_matrix_a, np_matrix_b)
56
+
57
+ # 将结果转换回列表的列表以符合返回类型
58
+ return result_matrix.tolist()
59
+ except ValueError as e:
60
+ # 处理矩阵维度不兼容导致无法乘法的情况
61
+ raise ValueError(f"矩阵乘法错误:{e}。请确保第一个矩阵的列数等于第二个矩阵的行数。")
62
+ except Exception as e:
63
+ # 捕获任何其他意外错误
64
+ raise Exception(f"矩阵乘法过程中发生意外错误:{e}")
65
+
66
+ import numpy as np
67
+ from decimal import Decimal, getcontext # 用于精确控制小数位数
68
+
69
+ @tool
70
+ def solve_linear_equations(coefficients: list[list[float]], constants: list[float]) -> dict:
71
+ """求解多元一次线性方程组。
72
+
73
+ 此工具接受一个系数矩阵和一个常数向量作为输入,并尝试求解由它们表示的线性方程组。
74
+ 方程组的通用形式为 Ax = B,其中 A 是 coefficients,B 是 constants。
75
+
76
+ 如果方程组有唯一的解,函数将返回一个字典,其中包含变量名(默认从 x1 开始)和它们对应的解。
77
+ 解会以字符串形式表示,对于浮点数保留两位小数。
78
+
79
+ Args:
80
+ coefficients: 系数矩阵,表示为浮点数列表的列表。例如,对于 2x + 3y = 7, x - y = 1,
81
+ 系数矩阵为 [[2, 3], [1, -1]]。
82
+ constants: 常数向量,表示为浮点数的列表。例如,对于上述方程组,常数向量为 [7, 1]。
83
+ """
84
+ try:
85
+ np_coefficients = np.array(coefficients)
86
+ np_constants = np.array(constants)
87
+
88
+ # 检查矩阵是否为方阵,以及常数向量的维度是否匹配
89
+ if np_coefficients.shape[0] != np_coefficients.shape[1]:
90
+ raise ValueError("系数矩阵必须是方阵(行数和列数必须相等),才能有唯一解。")
91
+ if np_coefficients.shape[0] != np_constants.shape[0]:
92
+ raise ValueError("系数矩阵的行数必须与常数向量的元素数量相等。")
93
+
94
+ # 使用 numpy 求解线性方程组
95
+ solutions = np.linalg.solve(np_coefficients, np_constants)
96
+
97
+ # 设置 Decimal 的精度,用于控制小数位数
98
+ getcontext().prec = 50 # 设置一个足够大的精度,以防止中间计算的损失
99
+
100
+ results = {}
101
+ for i, sol in enumerate(solutions):
102
+ var_name = f"x_{i+1}"
103
+
104
+ # 使用 Decimal 进行精确的四舍五入到两位小数
105
+ # 先转换为 Decimal,然后使用 quantize 方法
106
+ decimal_sol = Decimal(str(sol)) # 将浮点数转换为字符串再转换为Decimal,以避免浮点数精度问题
107
+
108
+ # 将小数部分量化到小数点后两位
109
+ # ROUND_HALF_UP 是四舍五入到最近的值,如果距离相等,则向上进位
110
+ # '0.01' 表示两位小数的精度
111
+ formatted_sol = decimal_sol.quantize(Decimal('0.01'), rounding='ROUND_HALF_UP')
112
+
113
+ # 检查是否为整数或者浮点数
114
+ if formatted_sol == formatted_sol.to_integral_value():
115
+ # 如果是整数,显示为整数
116
+ results[var_name] = str(int(formatted_sol))
117
+ else:
118
+ # 否则,显示为两位小数
119
+ results[var_name] = str(formatted_sol)
120
+
121
+ # 注意此版本不直接处理“分式”输出。如果需要分式,需要使用类似 SymPy 的符号计算库。
122
+ # 这里对于小数,我们提供格式化为两位小数的字符串。
123
+
124
+ return results
125
+
126
+ except np.linalg.LinAlgError:
127
+ # 捕获方程组无解或有无穷多解的情况
128
+ raise ValueError("方程组无唯一解(可能无解或有无穷多解)。")
129
+ except ValueError as e:
130
+ # 捕获因输入维度不匹配或其他问题引起的 ValueError
131
+ raise ValueError(f"输入错误:{e}")
132
+ except Exception as e:
133
+ # 捕获其他所有意外错误
134
+ raise Exception(f"求解线性方程组时发生意外错���:{e}")
135
+
136
+
137
+
138
+
139
 
140
  final_answer = FinalAnswerTool()
141