我发现自己想要使用作为拼图包的一部分提供的许可,但却对它们应该做的事情感到困惑:
http://docs.sympy.org/dev/modules/mpmath/calculus/approximation.html
交感表达式和sympy.mpmath表达式到底有什么区别?
如果我想要一个符号表达式的taylor近似,而不了解mp数包在做什么,我可以做以下工作:
#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'什么是数学函数?
它不是一个渐近表达式,也不是python函数。如何对任意表达式进行操作?
在文档中,我似乎不能接受任意的渐近表达式。http://docs.sympy.org/dev/modules/mpmath/calculus/approximation.html
如何将任意逼近( Pade / Cheby / Fourier )视为任意的渐近表达式?
编辑:
因此,我正在寻找的一个例子是下面的近似:
#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)]或者结果可能是整个交感表达式本身(它本身是a,b的函数):
wantedSympyExpression = Coef0Expression(a,b) + Coef1Expression(a,b) *(x**2) + ... + CoefNExpression(a,b) (x**N)注意,在执行近似之前,没有选择a和b。
发布于 2015-11-12 00:56:14
mpmath函数是普通的Python函数。他们只是用任意精确的算术来计算。
但是上面的这些没有任何意义,因为我知道不能从python函数中提取导数。
你不能象征性地取导数,但是你可以通过几次求函数并使用数值微分技术来计算导数的近似。这就是sympy.mpmath.taylor所做的。引用文档的话:
系数采用高阶数值微分法计算.该函数必须能够计算到任意精度。
发布于 2015-11-12 17:24:56
如果您有一个SymPy表达式,并且希望对它进行任意精确的计算,请使用evalf,如
sympy.sin(1).evalf(100)在计算之前,可以使用sin(x).evalf(100, subs={x:1})将x替换为1。evalf在引擎盖下使用use,所以这将给出与use相同的结果,但不需要直接使用use。
https://stackoverflow.com/questions/33662626
复制相似问题