2

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) を任意の 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は、近似を実行する前に選択されないことに注意してください。

4

2 に答える 2

1

mpmath 関数は通常の Python 関数です。それらは、任意精度の算術演算で計算を行うだけです。

しかし、Python 関数から導関数をとることはできないことを知っているので、上記は意味がありません。

導関数をシンボリックに取得することはできませんが、関数を数回評価し、数値微分手法を使用することで、導関数の近似を計算できます。これが何をするかsympy.mpmath.taylorです。ドキュメントの引用:

係数は、高次の数値微分を使用して計算されます。関数は、任意の精度で評価できる必要があります。

于 2015-11-12T00:56:14.583 に答える
1

SymPy 式があり、それを任意の精度で評価したい場合は、次evalfのように使用します。

sympy.sin(1).evalf(100)

評価する前sin(x).evalf(100, subs={x:1})に を に置き換えるために使用できます。フードの下で mpmath を使用するため、mpmath と同じ結果が得られますが、mpmath を直接使用する必要はありません。x1evalf

于 2015-11-12T17:24:56.903 に答える