【问题标题】:Python Sympy Arbitrary Approximation to Arbitrary Sympy Expression?Python Sympy 任意逼近任意 Sympy 表达式?
【发布时间】:2015-11-12 00:48:16
【问题描述】:

我发现自己想使用作为 mpmath 包的一部分提供的近似值,但对它们应该做什么感到困惑:

http://docs.sympy.org/dev/modules/mpmath/calculus/approximation.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/approximation.html

如何取任意近似值(Pade / Cheby Chev / 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') ) 

结果可以是作为ab 函数的系数表达式列表:

wantedSympyExpressionCoefficients = [ Coef0Expression(a,b), Coef1Expression(a,b), ... , CoefNExpression(a,b)]

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

wantedSympyExpression = Coef0Expression(a,b) + Coef1Expression(a,b) *(x**2) + ... + CoefNExpression(a,b) (x**N)

请注意,ab 不是在执行近似之前选择的。

【问题讨论】:

    标签: python sympy approximation mpmath


    【解决方案1】:

    mpmath 函数是普通的 Python 函数。他们只是在任意精度的算术中进行数学运算。

    但以上没有任何意义,因为我知道python函数不能取导数。

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

    使用高阶数值微分计算系数。该函数必须可以计算为任意精度。

    【讨论】:

    • 所以 - 我的 PythonFunctionOriginal 不能被评估为任意精度?
    • @DAdams:正确。这很可能是泰勒级数的高阶项最终为零的原因。
    • 这个答案对于 npmath 函数在做什么的解释非常有见地。也许我们可以将这个答案和问题What exactly is the difference between a sympy expression and a sympy.mpmath expression ? 迁移到另一个页面?
    【解决方案2】:

    如果您有一个 SymPy 表达式并希望将其计算为任意精度,请使用 evalf,例如

    sympy.sin(1).evalf(100)
    

    在评估之前,您可以使用sin(x).evalf(100, subs={x:1})x 替换为1evalf 在后台使用 mpmath,因此这将为您提供与 mpmath 相同的结果,但不必直接使用 mpmath。

    【讨论】:

    • 如果可行:这将是公认的答案 - 我欠你一个高五。
    • 好的 - 如果我替换每个变量,它会起作用,但我不能接受它作为答案 - 因为对于我的泰勒版本,我可以决定携带一个变量,进行近似,然后我的近似可以生成另一个 sympy 表达式。这个 npmath 东西不会让我得到一个 sympy 表达式作为另一个 sympy 表达式的近似值。不过,您仍然可以获得前五名!
    • 我不清楚你的问题是什么。你能举个例子吗?如果它不适合评论,您可以打开一个新问题。
    • 我希望为任意符号表达式的 chebychev/pade/fourier 生成一组符号系数。为了清楚起见,我编辑了问题的最后几行。
    • 最好把它写成一个新问题。这回答了您最初的问题(“sympy 表达式和 mpmath 表达式有什么区别?”)。