Python: TypeError: 'exp' object is not callable
Python: TypeError: 'exp' object is not callable
在编写程序寻找方程的解时,我得到以下类型错误:'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()
exp 是 numpy 的函数,您必须导入它或使用 numpy
调用它
from numpy import exp
brenth的第一个参数必须是可调用的(Python函数),代表objective函数。您的 equat1
是一个 SymPy 表达式(属于 class 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 *
不是一个好主意,因为导入会相互覆盖,导致混乱。
在编写程序寻找方程的解时,我得到以下类型错误:'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()
exp 是 numpy 的函数,您必须导入它或使用 numpy
调用它from numpy import exp
brenth的第一个参数必须是可调用的(Python函数),代表objective函数。您的 equat1
是一个 SymPy 表达式(属于 class 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 *
不是一个好主意,因为导入会相互覆盖,导致混乱。