2017-04-03 15 views
1

sympyで配列入力をlamdifyしたいと思います。Sympyは配列と組み合わせてlambdifyエラーを発生します

>>> sBeta(psi) 
>>> AttributeError: 'Mul' object has no attribute 'exp' 

私はそれをしようとした場合、この方法は、次のエラーが表示されます:

>>> sBeta(*psi) 
>>> TypeError: <lambda>() takes exactly 1 argument (79 given) 
私は今、次のエラーが表示される関数を呼び出ししようとした場合

import sympy as sym 
import numpy as np 

# Load Data 
data = np.loadtxt("D:\data.r2023.c87.dat", skiprows=1) 

# Access to columns 
vza = data [:,2] 
sza = data [:,4] 

# var_psi is the array input 
psi = (1/(np.cos(sza))) + (1/(np.cos(vza))) 
var_tau, var_omega, var_psi = sym.symbols('var_tau var_omega var_psi', real = True) 

sBetaFunc = sym.exp(-var_tau * var_psi) 
sBeta = sym.lambdify(var_psi, sBetaFunc, modules=[“numpy”, "sympy"]) 

:ここに私の最初の試みでした

私はこの問題についてたくさん読んでいます。しかし、何も私の問題や私の場合に適しているようです。

非常に複雑な関数を区別するためにsympyのdiff関数を使用したいので、これはsympy関数で必要です。

ありがとうございます。

編集:今、私はこの試みた

import sympy as sym 
import numpy as np 
from sympy.abc import w, x, y, z  

sBetaFunc = sym.exp(-var_tau * x) 
sBeta = sym.lambdify(x, sBetaFunc, modules=["sympy"]) 

は今、別のエラーが表示されます。

>>> sBeta(psi) 
>>> ValueError: sequence too large; cannot be greater than 32 

答えて

1

私はあなたが受け取るすべてのエラーメッセージについて完全にはわかりません。私が見つけた1つのことは、clash in name spaceによって引き起こされる可能性があるということでした。関数を明示的にインポートするので、これはおそらく問題ではありません。私はあなたがvar_tauの値を提供していないという事実に起因すると思います。

次はあなたが達成しようと何をすべき:

import sympy as sym 
import numpy as np 

var_tau, var_omega, var_psi = sym.symbols('var_tau var_omega var_psi', real=True) 

sBetaFunc = sym.exp(-var_tau * var_psi) 

# also take your tau into account 
sBeta = sym.lambdify((var_tau, var_psi), sBetaFunc, modules=np) 

# your data; replace with actual values 
psi = np.array([1, 2, 3]) 

# your value for tau 
my_tau = 1. 

# evaluate your function 
result = sBeta(my_tau, psi) 

その後result次のようになります - 私が持っている同じ問題に直面している誰かがある場合

array([ 0.36787944, 0.13533528, 0.04978707]) 
+1

その有用で包括的な回答をいただきありがとうございます! – petermailpan

0

あなたのための解決策: @クレブの答えによると、私はこの問題を解決しました:

その後result次のようになります。私は変数のようにvar_tauを扱う場合、それは非常にうまく機能、しかし

In [1]: sym.diff(result[1], var_tau) 
Out[1]: -2.0*2.71828182845905**(-2*var_tau) 

array([2.71828182845905**(-var_tau), 2.71828182845905**(-2*var_tau), 
    2.71828182845905**(-3*var_tau)], dtype=object) 

今、私はこのようなsym.diff機能を使用することができています。

関連する問題