2

関数 sin(x)/x とそのテイラー近似をプロットしようとしています。私はpython 3とpyzoを使用しています-最初のプロットは機能しますが、sympyモジュールからのシリーズを機能するnumpy式に変換する際に問題があります。

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
from sympy.abc import x

x = np.linspace(-10, 10, 100)
y = np.sin(x)/x #first function
plt.plot(x, y, 'k') #this is working fine

### this is a code that removes the "0(x**something)" part of 
the series at the end 

ここで見つけましたhttp://pastebin.com/ZNQakWP7

def series(expr, x, x0, n, removeO=False):
"""
sympy bugs avoided
"""
# expr_series = expr.series(x, x0, n)
# return expr_series.removeO() if removeO else expr_series
expansion = list()
for t in expr.lseries(x, x0):
    p = t.as_coeff_exponent(x)[1]
    if p < n:
        expansion.append(t)
    else:
        break
if not removeO:
    expansion.append(sp.O(x**n))
return sp.Add(*expansion)
### my code continued ####

y_t=series(sp.sin(x)/x,x,0,6,removeO=True)

y_t を見ると、この近似値が得られます

out: x**4/120 - x**2/6 + 1

最初の関数で行ったように、これをプロットするために、これを numpy に変換しようとしています。

f_t = lambdify(x, y_t,modules=['numpy'])
x = np.linspace(-10, 10, 100) #i do this because x has
#been a symbolic variable before

plt.plot(x, y_t, 'b') #this is where the problem occurs

最初のプロットにも 2 番目のエラー メッセージが表示されます。

 File "<console>", line 1, in <module>
  File "F:\pyzo2013_0_2_2\lib\site-packages\matplotlib\pyplot.py", line 2832, in plot
    ret = ax.plot(*args, **kwargs)
  File "F:\pyzo2013_0_2_2\lib\site-packages\matplotlib\axes.py", line 3998, in plot
    for line in self._get_lines(*args, **kwargs):

sympy から何かをプロットするというアイデアを実現するにはどうすればよいですか? 私が持っていた別のアイデアは、sympy をシリーズから文字列に変換し、これをどういうわけか numpy 式に解析することでした。ここで何か助けていただければ幸いです!

4

1 に答える 1

4

あなたの問題はこれだと思います:

plt.plot(x, y_t, 'b') #this is where the problem occurs

次のようにする必要があります。

plt.plot(x, f_t(x), 'b')

f_tラム化されたシリーズであるため、引数を評価する呼び出し可能な関数です。

次の例で使用lambdifyしましたが、うまくいきます。

from sympy.abc import x
from sympy import sin, series
from sympy.utilities.lambdify import lambdify

import numpy as np
import matplotlib.pyplot as plt


func = sin(x)/x
taylor = series(func, n=6).removeO()

evalfunc = lambdify(x, func, modules=['numpy'])
evaltaylor = lambdify(x, taylor, modules=['numpy'])

t = np.linspace(-5.5, 5.5, 100)
plt.plot(t, evalfunc(t), 'b', label='sin(x)/x')
plt.plot(t, evaltaylor(t), 'r', label='Taylor')
plt.legend(loc='best')
plt.show()

これがスクリプトによって生成されたプロットです。

ここに画像の説明を入力

于 2013-11-08T17:24:31.027 に答える