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.

148 lines
5.7 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.

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)
# 符号化自变量和nn作为符号保留
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()