【问题标题】:Python: TypeError: 'exp' object is not callablePython:TypeError:'exp'对象不可调用
【发布时间】:2018-04-16 20:37:13
【问题描述】:

在编写程序寻找方程式的解决方案时,我得到以下 TypeError: 'exp' object is not callable。我不明白我的错误是什么......

代码如下:

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()

【问题讨论】:

    标签: python sympy callable


    【解决方案1】:

    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 不会自动将实数转换为复杂数据类型。这是一个基于您的方程式的工作 sn-p:我使用 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 * 不是一个好主意,因为导入会相互覆盖,导致混乱。

    【讨论】:

    • 感谢您的帮助!我需要做的:我有一个 ABC 类型的复杂方程,我需要在 [a;b] 中找到 A、B 和 C 的实部的所有零点。也许是更好的方法来做到这一点?我可以以任何方式只对方程的实部进行操作吗?也许python中有一个函数可以找到[a;b]中的所有根?
    • 没有找到所有根的功能。二分法会找到一个根。但是,您的初始区间 [0.11, 0.14] 无法启动,因为它不是有效的包围区间:目标函数在末端没有不同的符号。在我的 sn-p 中,我使用了 fsolve。
    • 我试过你建议的解决方案,得到:“TypeError: can't convert complex to float” Arghhh...
    • 我发现发生了什么。谢谢:)
    【解决方案2】:

    exp 是 numpy 的函数,你必须导入它或使用 numpy 调用它

    from numpy import exp
    

    【讨论】:

    • 这不是 OP 想要使用的功能,他们的目标是使用 SymPy 中的 exp。
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2019-03-02
    • 2015-04-26
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多