spagestic commited on
Commit
5543e04
·
1 Parent(s): 9b3b8c8

modularized

Browse files
maths/calculus/calculate_limit.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sympy
2
+
3
+ def calculate_limit(expression_str: str, variable_str: str, point_str: str, direction: str = '+-') -> str:
4
+ """
5
+ Calculates the limit of an expression as a variable approaches a point.
6
+
7
+ Args:
8
+ expression_str: The mathematical expression as a string (e.g., "sin(x)/x").
9
+ variable_str: The variable in the expression (e.g., "x").
10
+ point_str: The point the variable is approaching (e.g., "0", "oo" for infinity).
11
+ direction: The direction of the limit ('+', '-', or '+-' for both sides).
12
+
13
+ Returns:
14
+ A string representing the limit or an error message.
15
+ """
16
+ try:
17
+ var = sympy.Symbol(variable_str)
18
+ local_dict = {variable_str: var}
19
+ expr = sympy.parse_expr(expression_str, local_dict=local_dict, transformations='all')
20
+
21
+ if point_str.lower() == 'oo':
22
+ point = sympy.oo
23
+ elif point_str.lower() == '-oo':
24
+ point = -sympy.oo
25
+ else:
26
+ point = sympy.sympify(point_str)
27
+
28
+ if direction == '+':
29
+ limit_val = sympy.limit(expr, var, point, dir='+')
30
+ elif direction == '-':
31
+ limit_val = sympy.limit(expr, var, point, dir='-')
32
+ else:
33
+ limit_val = sympy.limit(expr, var, point)
34
+
35
+ return str(limit_val)
36
+ except (sympy.SympifyError, TypeError, SyntaxError) as e:
37
+ return f"Error parsing expression or point: {e}. Ensure valid Sympy syntax (e.g. use 'oo' for infinity, ensure variables match)."
38
+ except Exception as e:
39
+ return f"An unexpected error occurred: {e}"
maths/calculus/calculus.py DELETED
@@ -1,265 +0,0 @@
1
- """
2
- Calculus operations for university level.
3
- """
4
- import sympy
5
- from sympy.parsing.mathematica import parse_mathematica # For robust expression parsing
6
- import numpy as np # For numerical integration if needed
7
- from typing import Callable, Union, List, Tuple
8
-
9
- # Define common symbols for Sympy expressions
10
- x, y, z, n = sympy.symbols('x y z n')
11
-
12
- def derivative_polynomial(coefficients):
13
- """
14
- Calculate the derivative of a polynomial function.
15
-
16
- Args:
17
- coefficients (list): List of coefficients from highest to lowest degree
18
-
19
- Returns:
20
- list: Coefficients of the derivative polynomial
21
- """
22
- if len(coefficients) <= 1:
23
- return [0]
24
-
25
- result = []
26
- for i, coef in enumerate(coefficients[:-1]):
27
- power = len(coefficients) - i - 1
28
- result.append(coef * power)
29
-
30
- return result
31
-
32
- def integral_polynomial(coefficients, c=0):
33
- """
34
- Calculate the indefinite integral of a polynomial function.
35
-
36
- Args:
37
- coefficients (list): List of coefficients from highest to lowest degree
38
- c (float): Integration constant
39
-
40
- Returns:
41
- list: Coefficients of the integral polynomial including constant term
42
- """
43
- result = []
44
- for i, coef in enumerate(coefficients):
45
- power = len(coefficients) - i
46
- result.append(coef / power)
47
-
48
- result.append(c) # Add integration constant
49
- return result
50
-
51
-
52
- def calculate_limit(expression_str: str, variable_str: str, point_str: str, direction: str = '+-') -> str:
53
- """
54
- Calculates the limit of an expression as a variable approaches a point.
55
-
56
- Args:
57
- expression_str: The mathematical expression as a string (e.g., "sin(x)/x").
58
- variable_str: The variable in the expression (e.g., "x").
59
- point_str: The point the variable is approaching (e.g., "0", "oo" for infinity).
60
- direction: The direction of the limit ('+', '-', or '+-' for both sides).
61
-
62
- Returns:
63
- A string representing the limit or an error message.
64
- """
65
- try:
66
- var = sympy.Symbol(variable_str)
67
- # Using parse_mathematica for more robust parsing than sympify alone
68
- # It handles expressions like "x^2" or "sin(x)" more reliably.
69
- # We need to ensure the variable is available in the parsing context.
70
- local_dict = {variable_str: var}
71
- expr = sympy.parse_expr(expression_str, local_dict=local_dict, transformations='all')
72
-
73
-
74
- if point_str.lower() == 'oo':
75
- point = sympy.oo
76
- elif point_str.lower() == '-oo':
77
- point = -sympy.oo
78
- else:
79
- point = sympy.sympify(point_str) # Can handle numbers or symbolic constants like pi
80
-
81
- if direction == '+':
82
- limit_val = sympy.limit(expr, var, point, dir='+')
83
- elif direction == '-':
84
- limit_val = sympy.limit(expr, var, point, dir='-')
85
- else: # '+-' default
86
- limit_val = sympy.limit(expr, var, point)
87
-
88
- return str(limit_val)
89
- except (sympy.SympifyError, TypeError, SyntaxError) as e:
90
- return f"Error parsing expression or point: {e}. Ensure valid Sympy syntax (e.g. use 'oo' for infinity, ensure variables match)."
91
- except Exception as e:
92
- return f"An unexpected error occurred: {e}"
93
-
94
-
95
- def taylor_series_expansion(expression_str: str, variable_str: str = 'x', point: float = 0, order: int = 5) -> str:
96
- """
97
- Computes the Taylor series expansion of an expression around a point.
98
-
99
- Args:
100
- expression_str: The mathematical expression (e.g., "exp(x)").
101
- variable_str: The variable (default 'x').
102
- point: The point around which to expand (default 0).
103
- order: The order of the Taylor polynomial (default 5).
104
-
105
- Returns:
106
- String representation of the Taylor series or an error message.
107
- """
108
- try:
109
- var = sympy.Symbol(variable_str)
110
- expr = sympy.parse_expr(expression_str, local_dict={variable_str: var}, transformations='all')
111
-
112
- series = expr.series(var, x0=point, n=order).removeO() # removeO() removes the O(x^n) term
113
- return str(series)
114
- except Exception as e:
115
- return f"Error calculating Taylor series: {e}"
116
-
117
-
118
- def fourier_series_example(function_type: str = "sawtooth", n_terms: int = 5) -> str:
119
- """
120
- Provides an example of a Fourier series for a predefined function.
121
-
122
- Args:
123
- function_type: "sawtooth" or "square" wave.
124
- n_terms: Number of terms to compute in the series.
125
-
126
- Returns:
127
- String representation of the Fourier series.
128
- """
129
- try:
130
- L = sympy.pi # Periodicity, assuming 2L = 2*pi for standard examples
131
- x = sympy.Symbol('x')
132
-
133
- if function_type == "sawtooth":
134
- # Sawtooth wave: f(x) = x for -pi < x < pi
135
- # a0 = 0
136
- # an = 0
137
- # bn = 2/L * integral(x*sin(n*pi*x/L), (x, 0, L))
138
- # = 2/pi * integral(x*sin(nx), (x, 0, pi))
139
- # = 2/pi * [-x*cos(nx)/n + sin(nx)/n^2]_0^pi
140
- # = 2/pi * [-pi*cos(n*pi)/n] = -2*(-1)^n / n
141
- series = sympy.S(0) # Start with zero, as a0 is 0
142
- for i in range(1, n_terms + 1):
143
- bn_coeff = -2 * ((-1)**i) / i
144
- series += bn_coeff * sympy.sin(i * x)
145
- return f"Fourier series for sawtooth wave (f(x)=x on [-pi,pi]): {str(series)}"
146
-
147
- elif function_type == "square":
148
- # Square wave: f(x) = -1 for -pi < x < 0, f(x) = 1 for 0 < x < pi
149
- # a0 = 0
150
- # an = 0
151
- # bn = 2/L * integral(f(x)*sin(n*pi*x/L), (x, 0, L)) where f(x)=1 for (0,L)
152
- # = 2/pi * integral(sin(nx), (x, 0, pi))
153
- # = 2/pi * [-cos(nx)/n]_0^pi
154
- # = 2/(n*pi) * (1 - cos(n*pi)) = 2/(n*pi) * (1 - (-1)^n)
155
- # This means bn is 4/(n*pi) if n is odd, and 0 if n is even.
156
- series = sympy.S(0)
157
- for i in range(1, n_terms + 1):
158
- if i % 2 != 0: # n is odd
159
- bn_coeff = 4 / (i * sympy.pi)
160
- series += bn_coeff * sympy.sin(i * x)
161
- return f"Fourier series for square wave (f(x)=1 on [0,pi], -1 on [-pi,0]): {str(series)}"
162
- else:
163
- return "Error: Unknown function type for Fourier series. Choose 'sawtooth' or 'square'."
164
- except Exception as e:
165
- return f"Error generating Fourier series: {e}"
166
-
167
-
168
- def partial_derivative(expression_str: str, variables_str: List[str]) -> str:
169
- """
170
- Computes partial derivatives of an expression with respect to specified variables.
171
- Example: expression_str="x**2*y**3", variables_str=["x", "y"] will compute d/dx then d/dy.
172
- If you want d^2f/dx^2, use variables_str=["x", "x"].
173
-
174
- Args:
175
- expression_str: The mathematical expression (e.g., "x**2*y + y*z**2").
176
- variables_str: A list of variable names (strings) to differentiate by, in order.
177
- (e.g., ["x", "y"] for d/dy(d/dx(expr)) ).
178
-
179
- Returns:
180
- String representation of the partial derivative or an error message.
181
- """
182
- try:
183
- # Create symbols for all variables that might appear in the expression
184
- # For simplicity, we'll assume 'x', 'y', 'z' are common, but user must specify which to derive by.
185
- # A more robust way would be to parse expression_str to find all symbols.
186
- symbols_in_expr = {s.name: s for s in sympy.parse_expr(expression_str, transformations='all').free_symbols}
187
-
188
- # Ensure variables to differentiate by are symbols
189
- diff_vars_symbols = []
190
- for var_name in variables_str:
191
- if var_name in symbols_in_expr:
192
- diff_vars_symbols.append(symbols_in_expr[var_name])
193
- else:
194
- # If a variable to differentiate by is not in free_symbols, it might be an error
195
- # or the expression doesn't depend on it. Sympy handles differentiation by non-present vars as 0.
196
- # We'll create the symbol anyway to pass to diff.
197
- diff_vars_symbols.append(sympy.Symbol(var_name))
198
-
199
- if not diff_vars_symbols:
200
- return "Error: No variables specified for differentiation."
201
-
202
- expr = sympy.parse_expr(expression_str, local_dict=symbols_in_expr, transformations='all')
203
-
204
- # Compute partial derivatives iteratively
205
- current_expr = expr
206
- for var_sym in diff_vars_symbols:
207
- current_expr = sympy.diff(current_expr, var_sym)
208
-
209
- return str(current_expr)
210
- except (sympy.SympifyError, TypeError, SyntaxError) as e:
211
- return f"Error parsing expression or variables: {e}"
212
- except Exception as e:
213
- return f"An unexpected error occurred: {e}"
214
-
215
-
216
- def multiple_integral(expression_str: str, integration_vars: List[Tuple[str, Union[str, float], Union[str, float]]]) -> str:
217
- """
218
- Computes definite multiple integrals.
219
-
220
- Args:
221
- expression_str: The mathematical expression (e.g., "x*y**2").
222
- integration_vars: A list of tuples, where each tuple contains:
223
- (variable_name_str, lower_bound_str_or_float, upper_bound_str_or_float).
224
- Example: [("x", "0", "1"), ("y", "0", "x")] for integral from 0 to 1 dx of integral from 0 to x dy of (x*y**2).
225
- The order in the list is the order of integration (inner to outer).
226
-
227
- Returns:
228
- String representation of the integral result or an error message.
229
- """
230
- try:
231
- # Create symbols for all variables that might appear in the expression
232
- # and in integration bounds.
233
- # A more robust approach might involve parsing the expression and bounds to identify all symbols.
234
- # For now, we'll default to x, y, z if not explicitly mentioned.
235
- present_symbols = {sym.name: sym for sym in sympy.parse_expr(expression_str, transformations='all').free_symbols}
236
-
237
- integration_params_sympy = []
238
- for var_name, lower_bound, upper_bound in integration_vars:
239
- var_sym = present_symbols.get(var_name, sympy.Symbol(var_name))
240
- if var_sym.name not in present_symbols: # Add if it wasn't in expression but is an integration var
241
- present_symbols[var_sym.name] = var_sym
242
-
243
- # Bounds can be numbers or expressions involving other variables
244
- # We need to ensure these other variables are available in the context for sympify
245
- lower_s = sympy.sympify(lower_bound, locals=present_symbols)
246
- upper_s = sympy.sympify(upper_bound, locals=present_symbols)
247
- integration_params_sympy.append((var_sym, lower_s, upper_s))
248
-
249
- if not integration_params_sympy:
250
- return "Error: No integration variables specified."
251
-
252
- expr = sympy.parse_expr(expression_str, local_dict=present_symbols, transformations='all')
253
-
254
- # Compute integral iteratively (from inner to outer)
255
- # Sympy's integrate function takes tuples like (x, 0, 1)
256
- # The order of integration_params_sympy should be from inner-most integral to outer-most.
257
- # For sympy.integrate, the order of variables in the list is outer to inner. So we reverse.
258
-
259
- integral_val = sympy.integrate(expr, *integration_params_sympy)
260
-
261
- return str(integral_val)
262
- except (sympy.SympifyError, TypeError, SyntaxError) as e:
263
- return f"Error parsing expression, bounds, or variables: {e}. Ensure bounds are numbers or valid expressions."
264
- except Exception as e:
265
- return f"An unexpected error occurred during integration: {e}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
maths/calculus/calculus_interface.py CHANGED
@@ -1,9 +1,11 @@
1
  import gradio as gr
2
- from maths.calculus.calculus import (
3
- derivative_polynomial, integral_polynomial,
4
- calculate_limit, taylor_series_expansion, fourier_series_example,
5
- partial_derivative, multiple_integral
6
- )
 
 
7
  import json # For parsing list of tuples for multiple integrals
8
 
9
  # University Math Tab
 
1
  import gradio as gr
2
+ from maths.calculus.derivative_polynomial import derivative_polynomial
3
+ from maths.calculus.integral_polynomial import integral_polynomial
4
+ from maths.calculus.calculate_limit import calculate_limit
5
+ from maths.calculus.taylor_series_expansion import taylor_series_expansion
6
+ from maths.calculus.fourier_series_example import fourier_series_example
7
+ from maths.calculus.partial_derivative import partial_derivative
8
+ from maths.calculus.multiple_integral import multiple_integral
9
  import json # For parsing list of tuples for multiple integrals
10
 
11
  # University Math Tab
maths/calculus/derivative_polynomial.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sympy
2
+
3
+ def derivative_polynomial(coefficients):
4
+ """
5
+ Calculate the derivative of a polynomial function.
6
+
7
+ Args:
8
+ coefficients (list): List of coefficients from highest to lowest degree
9
+
10
+ Returns:
11
+ list: Coefficients of the derivative polynomial
12
+ """
13
+ if len(coefficients) <= 1:
14
+ return [0]
15
+
16
+ result = []
17
+ for i, coef in enumerate(coefficients[:-1]):
18
+ power = len(coefficients) - i - 1
19
+ result.append(coef * power)
20
+
21
+ return result
maths/calculus/fourier_series_example.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sympy
2
+
3
+ def fourier_series_example(function_type: str = "sawtooth", n_terms: int = 5) -> str:
4
+ """
5
+ Provides an example of a Fourier series for a predefined function.
6
+
7
+ Args:
8
+ function_type: "sawtooth" or "square" wave.
9
+ n_terms: Number of terms to compute in the series.
10
+
11
+ Returns:
12
+ String representation of the Fourier series.
13
+ """
14
+ try:
15
+ L = sympy.pi
16
+ x = sympy.Symbol('x')
17
+ if function_type == "sawtooth":
18
+ series = sympy.S(0)
19
+ for i in range(1, n_terms + 1):
20
+ bn_coeff = -2 * ((-1)**i) / i
21
+ series += bn_coeff * sympy.sin(i * x)
22
+ return f"Fourier series for sawtooth wave (f(x)=x on [-pi,pi]): {str(series)}"
23
+ elif function_type == "square":
24
+ series = sympy.S(0)
25
+ for i in range(1, n_terms + 1):
26
+ if i % 2 != 0:
27
+ bn_coeff = 4 / (i * sympy.pi)
28
+ series += bn_coeff * sympy.sin(i * x)
29
+ return f"Fourier series for square wave (f(x)=1 on [0,pi], -1 on [-pi,0]): {str(series)}"
30
+ else:
31
+ return "Error: Unknown function type for Fourier series. Choose 'sawtooth' or 'square'."
32
+ except Exception as e:
33
+ return f"Error generating Fourier series: {e}"
maths/calculus/integral_polynomial.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sympy
2
+
3
+ def integral_polynomial(coefficients, c=0):
4
+ """
5
+ Calculate the indefinite integral of a polynomial function.
6
+
7
+ Args:
8
+ coefficients (list): List of coefficients from highest to lowest degree
9
+ c (float): Integration constant
10
+
11
+ Returns:
12
+ list: Coefficients of the integral polynomial including constant term
13
+ """
14
+ result = []
15
+ for i, coef in enumerate(coefficients):
16
+ power = len(coefficients) - i
17
+ result.append(coef / power)
18
+
19
+ result.append(c) # Add integration constant
20
+ return result
maths/calculus/multiple_integral.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sympy
2
+ from typing import List, Tuple, Union
3
+
4
+ def multiple_integral(expression_str: str, integration_vars: List[Tuple[str, Union[str, float], Union[str, float]]]) -> str:
5
+ """
6
+ Computes definite multiple integrals.
7
+
8
+ Args:
9
+ expression_str: The mathematical expression (e.g., "x*y**2").
10
+ integration_vars: A list of tuples, where each tuple contains:
11
+ (variable_name_str, lower_bound_str_or_float, upper_bound_str_or_float).
12
+ Example: [("x", "0", "1"), ("y", "0", "x")] for integral from 0 to 1 dx of integral from 0 to x dy of (x*y**2).
13
+ The order in the list is the order of integration (inner to outer).
14
+
15
+ Returns:
16
+ String representation of the integral result or an error message.
17
+ """
18
+ try:
19
+ present_symbols = {sym.name: sym for sym in sympy.parse_expr(expression_str, transformations='all').free_symbols}
20
+ integration_params_sympy = []
21
+ for var_name, lower_bound, upper_bound in integration_vars:
22
+ var_sym = present_symbols.get(var_name, sympy.Symbol(var_name))
23
+ if var_sym.name not in present_symbols:
24
+ present_symbols[var_sym.name] = var_sym
25
+ lower_s = sympy.sympify(lower_bound, locals=present_symbols)
26
+ upper_s = sympy.sympify(upper_bound, locals=present_symbols)
27
+ integration_params_sympy.append((var_sym, lower_s, upper_s))
28
+ if not integration_params_sympy:
29
+ return "Error: No integration variables specified."
30
+ expr = sympy.parse_expr(expression_str, local_dict=present_symbols, transformations='all')
31
+ integral_val = sympy.integrate(expr, *integration_params_sympy)
32
+ return str(integral_val)
33
+ except (sympy.SympifyError, TypeError, SyntaxError) as e:
34
+ return f"Error parsing expression, bounds, or variables: {e}. Ensure bounds are numbers or valid expressions."
35
+ except Exception as e:
36
+ return f"An unexpected error occurred during integration: {e}"
maths/calculus/partial_derivative.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sympy
2
+ from typing import List
3
+
4
+ def partial_derivative(expression_str: str, variables_str: List[str]) -> str:
5
+ """
6
+ Computes partial derivatives of an expression with respect to specified variables.
7
+ Example: expression_str="x**2*y**3", variables_str=["x", "y"] will compute d/dx then d/dy.
8
+ If you want d^2f/dx^2, use variables_str=["x", "x"].
9
+
10
+ Args:
11
+ expression_str: The mathematical expression (e.g., "x**2*y + y*z**2").
12
+ variables_str: A list of variable names (strings) to differentiate by, in order.
13
+ (e.g., ["x", "y"] for d/dy(d/dx(expr)) ).
14
+
15
+ Returns:
16
+ String representation of the partial derivative or an error message.
17
+ """
18
+ try:
19
+ symbols_in_expr = {s.name: s for s in sympy.parse_expr(expression_str, transformations='all').free_symbols}
20
+ diff_vars_symbols = []
21
+ for var_name in variables_str:
22
+ if var_name in symbols_in_expr:
23
+ diff_vars_symbols.append(symbols_in_expr[var_name])
24
+ else:
25
+ diff_vars_symbols.append(sympy.Symbol(var_name))
26
+ if not diff_vars_symbols:
27
+ return "Error: No variables specified for differentiation."
28
+ expr = sympy.parse_expr(expression_str, local_dict=symbols_in_expr, transformations='all')
29
+ current_expr = expr
30
+ for var_sym in diff_vars_symbols:
31
+ current_expr = sympy.diff(current_expr, var_sym)
32
+ return str(current_expr)
33
+ except (sympy.SympifyError, TypeError, SyntaxError) as e:
34
+ return f"Error parsing expression or variables: {e}"
35
+ except Exception as e:
36
+ return f"An unexpected error occurred: {e}"
maths/calculus/taylor_series_expansion.py ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sympy
2
+
3
+ def taylor_series_expansion(expression_str: str, variable_str: str = 'x', point: float = 0, order: int = 5) -> str:
4
+ """
5
+ Computes the Taylor series expansion of an expression around a point.
6
+
7
+ Args:
8
+ expression_str: The mathematical expression (e.g., "exp(x)").
9
+ variable_str: The variable (default 'x').
10
+ point: The point around which to expand (default 0).
11
+ order: The order of the Taylor polynomial (default 5).
12
+
13
+ Returns:
14
+ String representation of the Taylor series or an error message.
15
+ """
16
+ try:
17
+ var = sympy.Symbol(variable_str)
18
+ expr = sympy.parse_expr(expression_str, local_dict={variable_str: var}, transformations='all')
19
+ series = expr.series(var, x0=point, n=order).removeO()
20
+ return str(series)
21
+ except Exception as e:
22
+ return f"Error calculating Taylor series: {e}"