|
|
from sympy import *
|
|
|
from convert_formula import *
|
|
|
from number_list_limitation import limitation
|
|
|
from sympy import cos, sin
|
|
|
|
|
|
def mi_grade_number_zone(formula):
|
|
|
"""
|
|
|
计算幂级数的收敛域
|
|
|
:param formula: 幂级数的通项系数
|
|
|
:return: 收敛域
|
|
|
"""
|
|
|
expression = 'abs((' + formula.replace('n', '(n+1)') + ')/' + formula + ')'
|
|
|
r = limitation(expression)[0]
|
|
|
if r == 0:
|
|
|
return '(-oo, oo)'
|
|
|
else:
|
|
|
border = [False, False]
|
|
|
grade_num = '(' + formula + ')*(1/%s)^n'%r
|
|
|
if limitation(grade_num)[1] == True:
|
|
|
border[1] = True
|
|
|
grade_num = '(' + formula + ')*(-1/%s)^n'%r
|
|
|
if limitation(grade_num)[1] == True:
|
|
|
border[0] = True
|
|
|
if border[0] == True and border[1] == True:
|
|
|
return '['+ str(-1/r) + ', ' + str(1/r) + ']'
|
|
|
elif border[0] == False and border[1] == False:
|
|
|
return '('+ str(-1/r) + ', ' + str(1/r) + ')'
|
|
|
elif border[0] == True and border[1] == False:
|
|
|
return '('+ str(-1/r) + ', ' + str(1/r) + ']'
|
|
|
elif border[0] == False and border[1] == True:
|
|
|
return '['+ str(-1/r) + ', ' + str(1/r) + ')'
|
|
|
|
|
|
def mi_grade_number_sum(formula):
|
|
|
"""
|
|
|
计算幂级数的和函数
|
|
|
:param formula: 幂级数的通项
|
|
|
:return: 幂级数的和函数
|
|
|
"""
|
|
|
series_expr = convert_formula(formula)
|
|
|
x = symbols('x')
|
|
|
series_expr = str(series_expr).replace('n', 'i')
|
|
|
series_expr = convert_formula(series_expr)
|
|
|
series_expr = sympify(series_expr)
|
|
|
i, n = symbols('i n')
|
|
|
partial_sum = simplify(summation(series_expr, (i, 1, n)))
|
|
|
if isinstance(partial_sum, Piecewise):
|
|
|
for expr, condition in partial_sum.args:
|
|
|
if condition == True:
|
|
|
partial_sum = expr
|
|
|
break
|
|
|
return partial_sum
|
|
|
|
|
|
def mi_grade_number_series(function, n, x0=0):
|
|
|
function = convert_formula(function)
|
|
|
independent_variable, function = split_function(function)
|
|
|
independent_variable = symbols(independent_variable)
|
|
|
function = sympify(function)
|
|
|
taylor_series = function.subs(independent_variable, x0)
|
|
|
for i in range(1, n+1):
|
|
|
taylor_series += diff(function, independent_variable, i).subs(independent_variable, x0) * (independent_variable - x0)**i / factorial(i)
|
|
|
return taylor_series
|
|
|
|
|
|
def fuliye_grade_number(formula, T=2*pi):
|
|
|
"""
|
|
|
把函数展开成傅里叶级数
|
|
|
param formula: 函数表达式在(-T/2, T/2)上的表达式
|
|
|
param T: 周期
|
|
|
:return: 傅里叶级数展开式
|
|
|
"""
|
|
|
# 转换公式格式(复用现有工具函数)
|
|
|
formula = convert_formula(formula)
|
|
|
# 拆分自变量和函数表达式(假设split_function来自convert_formula.py)
|
|
|
independent_variable, function = split_function(formula)
|
|
|
# 符号化自变量和n(n作为符号保留)
|
|
|
x, t = symbols(f'{independent_variable} t')
|
|
|
n = symbols('n', integer=True, positive=True)
|
|
|
# 转换为sympy表达式
|
|
|
f = sympify(function)
|
|
|
# 构造傅里叶系数
|
|
|
a_0 = ((2/t) * integrate(f, (x, -t/2, t/2))).subs(t, T)
|
|
|
a_n = ((2/t) * integrate(f * cos(2 * n * x * pi / t), (x, -t/2, t/2))).subs(t, T)
|
|
|
b_n = ((2/t) * integrate(f * sin(2 * n * x * pi / t), (x, -t/2, t/2))).subs(t, T)
|
|
|
# 构造傅里叶级数
|
|
|
f_series = a_0/2 + Sum(a_n * cos(2 * n * pi * x / T) + b_n * sin(2 * n * pi * x / T), (n, 1, oo))
|
|
|
return f_series
|
|
|
|
|
|
def test():
|
|
|
"""
|
|
|
测试上述所有函数的测试函数
|
|
|
"""
|
|
|
# 导入必要的库
|
|
|
|
|
|
# 测试 mi_grade_number_zone 函数
|
|
|
formula_zone = 'n'
|
|
|
print("mi_grade_number_zone 测试结果:", mi_grade_number_zone(formula_zone))
|
|
|
|
|
|
# 测试 mi_grade_number_sum 函数
|
|
|
formula_sum = 'n*x**n'
|
|
|
print("mi_grade_number_sum 测试结果:", mi_grade_number_sum(formula_sum))
|
|
|
|
|
|
|
|
|
# 测试 mi_grade_number_series 函数
|
|
|
formula_series = 'f(x)=exp(x)'
|
|
|
print("mi_grade_number_series 测试结果:", mi_grade_number_series(formula_series, 10))
|
|
|
|
|
|
|
|
|
# 测试 fuliye_grade_number 函数
|
|
|
formula_fourier = 'f(x)=x'
|
|
|
print("fuliye_grade_number 测试结果:", fuliye_grade_number(formula_fourier))
|
|
|
|
|
|
def UI():
|
|
|
while True:
|
|
|
print("欢迎使用级数计算器")
|
|
|
print("1. 计算幂级数的收敛域")
|
|
|
print("2. 计算幂级数的和函数")
|
|
|
print("3. 计算幂级数的展开式")
|
|
|
print("4. 计算傅里叶级数展开式")
|
|
|
print("5. 退出")
|
|
|
choice = input("请输入您的选择(1/2/3/4/5):")
|
|
|
if choice not in ['1', '2', '3', '4', '5']:
|
|
|
print("无效选择,请重新输入!")
|
|
|
continue
|
|
|
if choice == '1':
|
|
|
formula_zone = input("请输入幂级数的通项的系数:")
|
|
|
print("幂级数的收敛域为:", mi_grade_number_zone(formula_zone))
|
|
|
elif choice == '2':
|
|
|
formula_sum = input("请输入幂级数的通项:")
|
|
|
print("幂级数的和函数为:", mi_grade_number_sum(formula_sum))
|
|
|
elif choice == '3':
|
|
|
formula_series = input("请输入函数表达式,格式f(x)=...:")
|
|
|
n = int(input("请输入展开的项数:"))
|
|
|
print("幂级数的展开式为:", mi_grade_number_series(formula_series, n))
|
|
|
elif choice == '4':
|
|
|
formula_fourier = input("请输入函数表达式,格式f(x)=...:")
|
|
|
T = input("请输入周期T,为2π请留空:")
|
|
|
if T == '':
|
|
|
T = 2*pi
|
|
|
else:
|
|
|
T = float(T)
|
|
|
print("傅里叶级数展开式为:", fuliye_grade_number(formula_fourier, T))
|
|
|
elif choice == '5':
|
|
|
print("谢谢使用,再见!")
|
|
|
break
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
test()
|
|
|
UI()
|