You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
5.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import unittest
from numpy import *
from sympy import *
from convert_formula import *
def definite_calculation(function,upper,lower):
"""
定积分计算
:param function: 被积函数
:param upper: 积分上限
:param lower: 积分下限
:return: 定积分值
"""
function= sympify(convert_formula(function))
x= symbols('x')
result= integrate(function, (x,lower,upper))
return float(result)
def variable_integral_calculation(function,upper,lower):
"""
变限积分计算
:param function: 被积函数
:param upper: 积分上限
:param lower: 积分下限
:return: 变限积分积分后函数
"""
function= sympify(convert_formula(function))
t,x= symbols('t x')
in_function= integrate(function, t)
if upper=='x':
num= in_function.subs(t,lower)
up=in_function.replace(t,x)
result=up-num
elif lower=='x':
num = in_function.subs(t, upper)
low = in_function.replace(t, x)
result = num - low
else:
return None
return result
def improper_integral_calculation(function,upper,lower):
"""
反常积分计算并判断敛散性
:param function: 被积函数
:param upper: 积分上限
:param lower: 积分下限
:return: 积分值
"""
function = sympify(convert_formula(function))
x = symbols('x')
in_function = integrate(function,x)
try:
if upper=='oo' and lower!= '-oo':
upper_num = limit(in_function, x, oo, dir="-")
lower_num = limit(in_function, x, lower, dir="+")
elif upper!='oo' and lower=='-oo':
upper_num = limit(in_function, x, upper, dir="-")
lower_num = limit(in_function, x, -oo, dir="+")
elif upper=='oo' and lower=='-oo':
upper_num = float(limit(in_function, x, oo, dir="-"))
lower_num = float(limit(in_function, x, -oo, dir="+"))
else:
in_function = integrate(function, x)
upper_num = in_function.subs(x,upper)
lower_num = in_function.subs(x,lower)
result = upper_num- lower_num
return result,True
except:
return None,False
class TestIntegralFunctions(unittest.TestCase):
def test_definite_integral(self):
"""测试定积分计算"""
# 测试案例1: ∫[0,1] x^2 dx = 1/3
self.assertEqual(definite_calculation('x^2', 1, 0), 1/3)
# 测试案例2: ∫[0,π] sin(x) dx = 2
self.assertEqual(definite_calculation('sin(x)', pi, 0), 2)
# 测试案例3: ∫[1,e] 1/x dx = 1
self.assertEqual(definite_calculation('1/x', E, 1), 1)
def test_variable_integral(self):
"""测试变限积分计算"""
x = symbols('x')
# 测试案例1: ∫[0,x] t dt = x^2/2
result = variable_integral_calculation('t', 'x', 0)
expected = x ** 2 / 2
self.assertEqual(simplify(result - expected), 0)
# 测试案例2: ∫[x,1] t^2 dt = 1/3 - x^3/3
result = variable_integral_calculation('t^2', 1, 'x')
expected = Rational(1, 3) - x ** 3 / 3
self.assertEqual(simplify(result - expected), 0)
def test_improper_integral(self):
"""测试反常积分计算"""
# 测试案例1: ∫[1,∞] 1/x^2 dx = 1 (收敛)
result, convergent = improper_integral_calculation('1/x^2', 'oo', 1)
self.assertEqual(result, 1)
self.assertTrue(convergent)
# 测试案例2: ∫[-∞,0] e^x dx = 1 (收敛)
result, convergent = improper_integral_calculation('exp(x)', 0, '-oo')
self.assertEqual(result, 1)
self.assertTrue(convergent)
# 测试案例3: ∫[-∞,∞] sin(x) dx (发散)
result, convergent = improper_integral_calculation('sin(x)', 'oo', '-oo')
self.assertIsNone(result)
self.assertFalse(convergent)
# 测试案例4: ∫[0,1] 1/sqrt(x) dx = 2 (收敛)
result, convergent = improper_integral_calculation('1/sqrt(x)', 1, 0)
self.assertEqual(result, 2)
self.assertTrue(convergent)
def UI():
while True:
command= input('请选择功能1.定积分计算2.变限积分计算3.反常积分计算和敛散性4.退出')
if command=='1':
function = input('请输入以x为变量的被积函数')
upper = input('请输入积分上限:')
lower = input('请输入积分下限:')
print('定积分积分结果:',definite_calculation(function, upper, lower))
elif command=='2':
function = input('请输入以t为变量的被积函数')
upper = input('请输入积分上限:')
lower = input('请输入积分下限:')
print('变限积分积分结果:',variable_integral_calculation(function, upper, lower))
elif command=='3':
function = input('请输入以x为变量的被积函数')
upper = input('请输入积分上限:')
lower = input('请输入积分下限:')
num,convergent= improper_integral_calculation(function,upper,lower)
print('反常积分的计算值:',num)
if convergent:
print('反常积分收敛')
else:
print('反常积分发散')
elif command=='4':
break
if __name__ == "__main__":
# 运行测试但不退出,允许后续代码执行
unittest.main(exit=False)
UI()