2017-08-01 2 views
1

私の多変数微積分クラスのプロジェクトに取り組んでいます。私の目的は、任意の関数f(x、y)をグラフ化し、等高線プロットを使って、/dx、df/dy)と関数の勾配のための震度プロットがありますが、より複雑な関数をグラフにしながら問題があります。任意の3次元関数をグラフ化しようとするとエラーが発生する

f(x、y)=(x + y)** 2のような関数入力の場合、プログラムはうまく動作しますが、より複雑な数学的概念を必要とする入力。X、Y)=罪(のx * yが)私はエラーを取得する:

TypeError例外:長さだけ-1配列はPythonのスカラーに変換することができ

stackoverflowの上のこれの例がたくさんあります、私のプログラムでは、任意の関数を作成するためにsympyに依存していて、配列計算にはnumpyが必要なので、この問題を回避する方法はわかりません。

''' 
Imports 
''' 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import axes3d 
import numpy as np 
from sympy import * 

x = Symbol('x') 
y = Symbol('y') 

lims = [-10, 10] 
function = sin(x+y) 
lam_function = lambdify((x,y),function) 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
gX, gY = np.meshgrid(np.arange(lims[0], lims[1], 0.05), 
        np.arange(lims[0], lims[1], 0.05)) 
z = lam_function(gX, gY) 
plot = ax.plot_surface(gX, gY, z, cmap=plt.cm.jet, linewidth=0) 
plt.colorbar(plot, cmap=plt.cm.jet) 
plt.show() 
+0

ユーザーの入力に頼らないようにサンプルコードを調整できますか?それは、コードを入力している入力がわからないため、エラーを再現することはできません。また、使用していないと思われるたくさんのものをインポートしているため、コード内で何が起こっているのか分かりにくくなります。 – Blckknght

+0

@Blckknght私は、エラーを発生させ、すべての無駄なインポートを削除した正確な関数を示すコードを編集しました。 – BooleanDesigns

答えて

1

ソリューションは簡単です:あなたは、これは結果としての機能がnumpyの互換性があることを保証しますlambdify

lam_function = sym.lambdify((x,y), function, "numpy") 

で、使用するパッケージを指定する必要があります。これはsin, cos, atan, logのような基本機能では機能しますが、より複雑なもの、例えばsympy.lowergammaの場合には失敗する可能性があります。

sympyのdocumentationを詳しく見てみると、具体的な説明なしにpolinamialsが動作する理由は、"numpy"は分かりやすいです。パッケージが指定されていない場合、sympyはpython-math,numpyおよびmpmathの順番で試します。今度は、pythonの数学xはnumpyと実際には違っていませんが、python-math sinはnumpyの配列を扱うことができないため、大きく異なります。

最後の1つ:sympy(1.1.1+)の新しいバージョンはdifferentlyのように動作します。これらの新しいバージョンでは、sympy.lambdifyは、math, mpmath, sympyに頼らないとインストールされた場合、デフォルトでnumpyを使用しようとします。

関連する問題