Я обнаружил, что хочу использовать аппроксимации, предоставляемые как часть пакета mpmath, но не понимаю, что именно они должны делать:
http://docs.sympy.org/dev/modules/mpmath/calculus/closed.html
В чем именно разница между выражением sympy и выражением sympy.mpmath?
Если мне нужно тейлоровское приближение к символьному выражению без понимания того, что делает пакет mpmath, я могу сделать следующее:
#Imports
import sympy
import sympy.parsing
import sympy.parsing.sympy_parser
import Library_TaylorApproximation
#Create a sympy expression to approximate
ExampleStringExpression = 'sin(x)'
ExampleSympyExpression = sympy.parsing.sympy_parser.parse_expr(ExampleStringExpression)
#Create a taylor expantion sympy expression around the point x=0
SympyTaylorApproximation = sympy.series(
ExampleSympyExpression,
sympy.Symbol('x'),
1,
4,
).removeO()
#Cast the sympy expressions to python functions which can be evaluated:
VariableNames = [str(var) for var in SympyTaylorApproximation.free_symbols]
PythonFunctionOriginal = sympy.lambdify(VariableNames, ExampleSympyExpression)
PythonFunctionApproximation = sympy.lambdify(VariableNames, SympyTaylorApproximation)
#Evaluate the approximation and the original at a point:
print PythonFunctionOriginal(2)
print PythonFunctionApproximation(2)
#>>> 0.909297426826
#>>> 0.870987413961
Однако, если я попытаюсь сделать то же самое с mpmath на основе документации:
TaylorCoefficients = sympy.mpmath.taylor(ExampleSympyExpression, 1, 4 )
print 'TaylorCoefficients', TaylorCoefficients
#>>> TypeError: 'sin' object is not callable
Я могу попытаться втиснуть туда функцию python (которую можно вызвать):
TaylorCoefficients = sympy.mpmath.taylor(PythonFunctionOriginal, 1, 4 )
print 'TaylorCoefficients', TaylorCoefficients
#>>> TaylorCoefficients [mpf('0.8414709848078965'), mpf('0.0'), mpf('0.0'), mpf('0.0'), mpf('-8.3694689805155739e+57')]
Но вышеизложенное не имеет никакого смысла, потому что я знаю, что нельзя брать производные от функции python.
Я могу вызвать функцию mpmath sin
:
TaylorCoefficients = sympy.mpmath.taylor(sympy.mpmath.sin, 1, 4 )
print 'TaylorCoefficients', TaylorCoefficients
#>>> TaylorCoefficients [mpf('0.8414709848078965'), mpf('0.54030230586813977'), mpf('-0.42073549240394825'), mpf('-0.090050384311356632'), mpf('0.035061291033662352')]
Но тогда я не могу делать над ним манипуляции так, как мне бы тоже хотелось -> как Если бы я хотел
SinTimesCos = sympy.mpmath.sin*sympy.mpmath.cos
TaylorCoefficients = sympy.mpmath.taylor(SinTimesCos, 1, 4 )
print 'TaylorCoefficients', TaylorCoefficients
#>>> TypeError: unsupported operand type(s) for *: 'function' and 'function'
ЧТО такое функция mpmath?
Это не выражение sympy, и это также не функция python. Как выполнять манипуляции с произвольными выражениями?
Казалось бы, я не могу аппроксимировать произвольные выражения sympy в документации. http://docs.sympy.org/dev/modules/mpmath/calculus/closed.html
Как я могу использовать произвольные приближения (Паде/Чеби-Шев/Фурье) к произвольным выражениям sympy?
РЕДАКТИРОВАТЬ:
Итак, примером того, что я ищу, является следующее приближение:
#Start with a sympy expression of (a, b, x)
expressionString = 'cos(a*x)*sin(b*x)*(x**2)'
expressionSympy = sympy.parsing.sympy_parser.parse_expr(expressionString)
#Do not want to decide on value of `a or b` in advance.
#Do want approximation with respect to x:
wantedSympyExpression = SympyChebyChev( expressionSympy, sympy.Symbol('x') )
Результатом может быть либо список выражений коэффициентов, являющихся функциями a
и b
:
wantedSympyExpressionCoefficients = [ Coef0Expression(a,b), Coef1Expression(a,b), ... , CoefNExpression(a,b)]
ИЛИ результатом может быть само выражение sympy целиком (которое само по себе является функцией a
, b
):
wantedSympyExpression = Coef0Expression(a,b) + Coef1Expression(a,b) *(x**2) + ... + CoefNExpression(a,b) (x**N)
Обратите внимание, что a
и b
не выбираются до выполнения аппроксимации.