首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Sympy任意逼近任意Sympy表达式?

Python Sympy任意逼近任意Sympy表达式?
EN

Stack Overflow用户
提问于 2015-11-12 00:48:16
回答 2查看 1.1K关注 0票数 2

我发现自己想要使用作为拼图包的一部分提供的许可,但却对它们应该做的事情感到困惑:

http://docs.sympy.org/dev/modules/mpmath/calculus/approximation.html

交感表达式和sympy.mpmath表达式到底有什么区别?

如果我想要一个符号表达式的taylor近似,而不了解mp数包在做什么,我可以做以下工作:

代码语言:javascript
复制
#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做同样的事情:

代码语言:javascript
复制
TaylorCoefficients = sympy.mpmath.taylor(ExampleSympyExpression, 1, 4 )
print 'TaylorCoefficients', TaylorCoefficients

#>>> TypeError: 'sin' object is not callable

我可以尝试将python函数塞入其中(这是可调用的):

代码语言:javascript
复制
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

代码语言:javascript
复制
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')]

但是我不能用我想要的方式来操作->,就像我想要的那样

代码语言:javascript
复制
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 )视为任意的渐近表达式?

编辑:

因此,我正在寻找的一个例子是下面的近似:

代码语言:javascript
复制
#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') ) 

结果可以是ab函数的系数表达式列表。

代码语言:javascript
复制
wantedSympyExpressionCoefficients = [ Coef0Expression(a,b), Coef1Expression(a,b), ... , CoefNExpression(a,b)]

或者结果可能是整个交感表达式本身(它本身是ab的函数):

代码语言:javascript
复制
wantedSympyExpression = Coef0Expression(a,b) + Coef1Expression(a,b) *(x**2) + ... + CoefNExpression(a,b) (x**N)

注意,在执行近似之前,没有选择ab

EN

回答 2

Stack Overflow用户

发布于 2015-11-12 00:56:14

mpmath函数是普通的Python函数。他们只是用任意精确的算术来计算。

但是上面的这些没有任何意义,因为我知道不能从python函数中提取导数。

你不能象征性地取导数,但是你可以通过几次求函数并使用数值微分技术来计算导数的近似。这就是sympy.mpmath.taylor所做的。引用文档的话:

系数采用高阶数值微分法计算.该函数必须能够计算到任意精度。

票数 1
EN

Stack Overflow用户

发布于 2015-11-12 17:24:56

如果您有一个SymPy表达式,并且希望对它进行任意精确的计算,请使用evalf,如

代码语言:javascript
复制
sympy.sin(1).evalf(100)

在计算之前,可以使用sin(x).evalf(100, subs={x:1})x替换为1evalf在引擎盖下使用use,所以这将给出与use相同的结果,但不需要直接使用use。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33662626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档