|
|
|
|
@ -14,6 +14,9 @@ def first_kind_curve_integration(r, t_range, function):
|
|
|
|
|
:return: 第一类曲线积分的值
|
|
|
|
|
"""
|
|
|
|
|
t = sp.symbols('t')
|
|
|
|
|
r_tuple = eval(r) # 将输入的字符串转换为元组
|
|
|
|
|
# 将元组中每个元素转换为sympy表达式(类似处理function的方式)
|
|
|
|
|
r = tuple(sp.sympify(convert_formula(elem)) for elem in r_tuple)
|
|
|
|
|
if len(r) == 2:
|
|
|
|
|
x, y = r
|
|
|
|
|
dx_dt = sp.diff(x, t)
|
|
|
|
|
@ -25,8 +28,10 @@ def first_kind_curve_integration(r, t_range, function):
|
|
|
|
|
dy_dt = sp.diff(y, t)
|
|
|
|
|
dz_dt = sp.diff(z, t)
|
|
|
|
|
ds = sp.sqrt(dx_dt**2 + dy_dt**2 + dz_dt**2)
|
|
|
|
|
else:
|
|
|
|
|
raise ValueError("参数方程长度必须为2(二维曲线)或3(三维曲线)")
|
|
|
|
|
function = sp.sympify(convert_formula(function))
|
|
|
|
|
lower, upper = t_range
|
|
|
|
|
lower, upper = eval(t_range)
|
|
|
|
|
result = sp.integrate(function * ds, (t, lower, upper))
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
@ -40,13 +45,17 @@ def second_kind_curve_integration(P, Q, r, t_range):
|
|
|
|
|
:return: 第二类曲线积分的值
|
|
|
|
|
"""
|
|
|
|
|
t = sp.symbols('t')
|
|
|
|
|
# 转换r为sympy表达式元组
|
|
|
|
|
r_tuple = eval(r)
|
|
|
|
|
r = tuple(sp.sympify(convert_formula(elem)) for elem in r_tuple)
|
|
|
|
|
x, y = r
|
|
|
|
|
dx_dt = sp.diff(x, t)
|
|
|
|
|
dy_dt = sp.diff(y, t)
|
|
|
|
|
P = sp.sympify(convert_formula(P))
|
|
|
|
|
Q = sp.sympify(convert_formula(Q))
|
|
|
|
|
lower, upper = t_range
|
|
|
|
|
result = sp.integrate(P * dx_dt + Q * dy_dt, (t, lower, upper))
|
|
|
|
|
# 将 P 和 Q 中的 x、y 替换为 t 的函数
|
|
|
|
|
P_expr = sp.sympify(convert_formula(P)).subs({sp.symbols('x'): x, sp.symbols('y'): y})
|
|
|
|
|
Q_expr = sp.sympify(convert_formula(Q)).subs({sp.symbols('x'): x, sp.symbols('y'): y})
|
|
|
|
|
lower, upper = eval(t_range)
|
|
|
|
|
result = sp.integrate(P_expr * dx_dt + Q_expr * dy_dt, (t, lower, upper))
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
def first_kind_surface_integration(r, u_range, v_range, function):
|
|
|
|
|
@ -59,14 +68,18 @@ def first_kind_surface_integration(r, u_range, v_range, function):
|
|
|
|
|
:return: 第一类曲面积分的值
|
|
|
|
|
"""
|
|
|
|
|
u, v = sp.symbols('u v')
|
|
|
|
|
# 转换r为sympy表达式元组
|
|
|
|
|
r_tuple = eval(r)
|
|
|
|
|
r = tuple(sp.sympify(convert_formula(elem)) for elem in r_tuple)
|
|
|
|
|
x, y, z = r
|
|
|
|
|
ru = (sp.diff(x, u), sp.diff(y, u), sp.diff(z, u))
|
|
|
|
|
rv = (sp.diff(x, v), sp.diff(y, v), sp.diff(z, v))
|
|
|
|
|
cross_product = (ru[1]*rv[2] - ru[2]*rv[1], ru[2]*rv[0] - ru[0]*rv[2], ru[0]*rv[1] - ru[1]*rv[0])
|
|
|
|
|
E = sp.sqrt(cross_product[0]**2 + cross_product[1]**2 + cross_product[2]**2)
|
|
|
|
|
# 转换function为sympy表达式
|
|
|
|
|
function = sp.sympify(convert_formula(function))
|
|
|
|
|
u1, u2 = u_range
|
|
|
|
|
v1, v2 = v_range
|
|
|
|
|
u1, u2 = eval(u_range)
|
|
|
|
|
v1, v2 = eval(v_range)
|
|
|
|
|
integration1 = sp.integrate(function * E, (u, u1, u2))
|
|
|
|
|
result = sp.integrate(integration1, (v, v1, v2))
|
|
|
|
|
return result
|
|
|
|
|
@ -84,16 +97,23 @@ def second_kind_surface_integration(P, Q, R, r, u_range, v_range):
|
|
|
|
|
:return: 第二类曲面积分的值
|
|
|
|
|
"""
|
|
|
|
|
u, v = sp.symbols('u v')
|
|
|
|
|
# 转换r为sympy表达式元组
|
|
|
|
|
r_tuple = eval(r)
|
|
|
|
|
r = tuple(sp.sympify(convert_formula(elem)) for elem in r_tuple)
|
|
|
|
|
x, y, z = r
|
|
|
|
|
ru = (sp.diff(x, u), sp.diff(y, u), sp.diff(z, u))
|
|
|
|
|
rv = (sp.diff(x, v), sp.diff(y, v), sp.diff(z, v))
|
|
|
|
|
# 计算叉乘 cross_product(原方向指向内部,取反后指向外侧)
|
|
|
|
|
cross_product = (ru[1]*rv[2] - ru[2]*rv[1], ru[2]*rv[0] - ru[0]*rv[2], ru[0]*rv[1] - ru[1]*rv[0])
|
|
|
|
|
P = sp.sympify(convert_formula(P))
|
|
|
|
|
Q = sp.sympify(convert_formula(Q))
|
|
|
|
|
R = sp.sympify(convert_formula(R))
|
|
|
|
|
u1, u2 = u_range
|
|
|
|
|
v1, v2 = v_range
|
|
|
|
|
integration1 = sp.integrate(P * cross_product[0] + Q * cross_product[1] + R * cross_product[2], (u, u1, u2))
|
|
|
|
|
# 取反叉乘结果以匹配外侧法向量
|
|
|
|
|
cross_product = (-cross_product[0], -cross_product[1], -cross_product[2])
|
|
|
|
|
# 将 P、Q、R 中的 x、y、z 替换为 u、v 的函数
|
|
|
|
|
P_expr = sp.sympify(convert_formula(P)).subs({sp.symbols('x'): x, sp.symbols('y'): y, sp.symbols('z'): z})
|
|
|
|
|
Q_expr = sp.sympify(convert_formula(Q)).subs({sp.symbols('x'): x, sp.symbols('y'): y, sp.symbols('z'): z})
|
|
|
|
|
R_expr = sp.sympify(convert_formula(R)).subs({sp.symbols('x'): x, sp.symbols('y'): y, sp.symbols('z'): z})
|
|
|
|
|
u1, u2 = eval(u_range)
|
|
|
|
|
v1, v2 = eval(v_range)
|
|
|
|
|
integration1 = sp.integrate(P_expr * cross_product[0] + Q_expr * cross_product[1] + R_expr * cross_product[2], (u, u1, u2))
|
|
|
|
|
result = sp.integrate(integration1, (v, v1, v2))
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
@ -280,11 +300,4 @@ def UI():
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
UI()
|
|
|
|
|
unittest.main(exit=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unittest.main(exit=False)
|