Python:TypeError:' exp'对象不可调用

时间:2018-04-16 20:37:13

标签: python sympy callable

在编写程序找到方程的解时,我得到以下TypeError:' exp'对象不可调用。我不明白我的错误是什么......

以下代码:

from scipy import *
from numpy.linalg import *
from sympy import *
import sys
import numpy
import cmath
import math
from scipy import optimize

from sympy.solvers import solve

file=open('solve1.txt','w')
print 'Start'

y=Symbol('y')

equat1=exp(-1.0j*(36.96*y**0.5+1.367*(-1.25*y+2.33)**0.5+30.996*(1.25*y-0.675)**0.5))

Solution1 = optimize.brenth(equat1, 0.11, 0.14)

print 'Solution first:'
print Solution1
file.write(str(Solution1))

file.close()

2 个答案:

答案 0 :(得分:2)

brenth的第一个参数必须是可调用的(Python函数),表示目标函数。您的equat1是一个SymPy表达式(类exp,因为它的最外层是exp函数),而且这是不可调用的。

可以使用lambdify从SymPy表达式中调用:

optimize.brenth(lambdify(y, equat1), 0.11, 0.14) 

这会执行,但会有关于复杂值的(适当的)警告。 brenth期待一个真正有价值的功能。一般来说,无论如何,不​​能指望实部和虚部在同一点消失。最后,函数exp永远不会变为零,那么您真正期望获得什么?考虑一下你的意思是将实部,虚部或其他部分等于零。

你根本不需要SymPy;直接定义可调用允许

equat1 = lambda y: (a formula returning the thing to be equated to 0)

通过这种方式,您可以更好地控制复杂值的处理;可能使用cmath,或在NumPy中声明complex dtype。因此,sqrt存在负数的问题,因为NumPy不会自动将实数转换为复杂数据类型。这是一个基于等式的工作片段:我使用了cmath.sqrt,以便正确处理负数的根。

import cmath
from scipy import optimize
equat1 = lambda y: cmath.exp(-1.0j*(36.96*y**0.5+1.367*cmath.sqrt(-1.25*y+2.33)+30.996*cmath.sqrt(1.25*y-0.675))).real
print(optimize.fsolve(equat1, 0.11))    #  array([ 0.1073826])  

除此之外:对多个模块使用from module import *不是一个好主意,因为导入会相互覆盖,导致混乱。

答案 1 :(得分:-1)

exp是numpy的功能,您必须导入它或使用numpy

调用它
from numpy import exp