首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合数组的Sympy lambdify错误

结合数组的Sympy lambdify错误
EN

Stack Overflow用户
提问于 2017-04-03 09:28:45
回答 2查看 480关注 0票数 1

我想用同情来修饰数组输入。这是我的第一次尝试:

代码语言:javascript
复制
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"])

如果我现在尝试调用该函数,将出现以下错误:

代码语言:javascript
复制
>>> sBeta(psi)
>>> AttributeError: 'Mul' object has no attribute 'exp'

如果以这种方式尝试,将出现以下错误:

代码语言:javascript
复制
>>> sBeta(*psi)
>>> TypeError: <lambda>() takes exactly 1 argument (79 given)

我读了很多关于这个问题的文章。然而,似乎没有什么适合我的问题或我的情况。

我需要一个渐近函数,因为我想用微分函数和渐近函数来区分一些非常复杂的函数。

谢谢你的进阶。

编辑:

现在我试了一下:

代码语言:javascript
复制
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"])

现在出现了另一个错误:

代码语言:javascript
复制
>>> sBeta(psi)
>>> ValueError: sequence too large; cannot be greater than 32
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-03 15:21:37

我不完全确定您收到的所有错误消息;我发现的一件事是,它可能是由clash in name space引起的。当您显式导入函数时,这里可能不是这个问题。我认为这是因为您没有为var_tau提供值。

以下是您想要完成的任务:

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
array([ 0.36787944,  0.13533528,  0.04978707])
票数 1
EN

Stack Overflow用户

发布于 2017-04-04 08:35:33

如果有人面临同样的问题,我会给你一个解决方案:根据@Cleb的回答,我解决了这个问题,这就是:

代码语言:javascript
复制
    psi = np.array([1, 2, 3])

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

    sBeta = sym.lambdify((x, y), np.e**(-x*y), ["numpy", "sympy"])
    result = sBeta(var_tau, psi)

然后result看起来是这样的:

代码语言:javascript
复制
array([2.71828182845905**(-var_tau), 2.71828182845905**(-2*var_tau),
   2.71828182845905**(-3*var_tau)], dtype=object)

现在,我能够像这样使用sym.diff函数:

代码语言:javascript
复制
In [1]: sym.diff(result[1], var_tau)
Out[1]: -2.0*2.71828182845905**(-2*var_tau)

但是,如果我把var_tau作为一个变量来处理,它会很好地工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43181028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档