Python:TypeError:“exp”对象不是callab

2024-09-30 18:27:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在编写程序寻找方程的解时,我得到以下类型的错误:“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()

Tags: 对象fromimportnumpy类型错误scipyfile
2条回答

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

可以使用^{}使SymPy表达式可调用:

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

这会执行,但会发出关于复杂值的(适当的)警告。^{value函数需要exp永远不会变成零,那么您真正期望得到什么呢?考虑一下,如果你想把实部,虚部,或者别的什么东西等于零。在

您根本不需要SymPy;直接定义callable允许

^{pr2}$

这样您就可以更好地控制复杂值的处理;可能使用cmath,或者在NumPy中声明complexdtype。也就是说,负数的sqrt存在问题,因为NumPy不会自动将real转换为复杂的数据类型。下面是一个基于你的公式的工作片段:我用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是numpy的函数,您必须导入它或使用numpy调用它

from numpy import exp

相关问题 更多 >