Python:类型错误: 'exp' 对象不可调用

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

最佳答案

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 * 并不是一个好主意,因为导入会互相覆盖,导致困惑。

关于Python:类型错误: 'exp' 对象不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49865843/

相关文章:

.net - 有没有关于如何命名变量的教程?

python - SymPy 无法求解三角方程组

python - Sympy 提取傅里叶级数系数

java - “管道未连接”到 Java Callable 子节点

Java 线程池和创建可运行对象的可运行对象

java - 深入理解Java中的Reactive Programming

python - 我们如何使用 Python 通过网络传输大量数据?

python - 稀疏数据的 3D 数组与稀疏矩阵

python - 代入后分布带常数项的和的导数

python - 使用单个元组调用 PyObject_CallMethod 会解压参数吗?