修改曲线曲面积分

main
Mu_Xin 9 months ago
parent 3ad797b620
commit 15b5156b59

@ -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)
Loading…
Cancel
Save