<p><a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.brenth.html" rel="nofollow noreferrer">brenth</a>的第一个参数必须是可调用的(Python函数),表示目标函数。您的<code>equat1</code>是一个SymPy表达式(属于<code>exp</code>类,因为它的最外层是<code>exp</code>函数),这是不可调用的。在</p>
<p>可以使用<a href="http://docs.sympy.org/latest/modules/utilities/lambdify.html" rel="nofollow noreferrer">^{<cd4>}</a>使SymPy表达式可调用:</p>
<pre><code>optimize.brenth(lambdify(y, equat1), 0.11, 0.14)
</code></pre>
<p>这会执行,但会发出关于复杂值的(适当的)警告。^{value函数需要<cd5}。不管怎么说,在同一点上,都不能期望实部和虚部都消失。最后,函数<code>exp</code>永远不会变成零,那么您真正期望得到什么呢?考虑一下,如果你想把实部,虚部,或者别的什么东西等于零。在</p>
<p>您根本不需要SymPy;直接定义callable允许</p>
^{pr2}$
<p>这样您就可以更好地控制复杂值的处理;可能使用<code>cmath</code>,或者在NumPy中声明<code>complex</code>dtype。也就是说,负数的<code>sqrt</code>存在问题,因为NumPy不会自动将real转换为复杂的数据类型。下面是一个基于你的公式的工作片段:我用cmath.sqrt公司从而正确处理负数的根。在</p>
<pre><code>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])
</code></pre>
<hr/>
<p>旁白:对多个模块使用<code>from module import *</code>不是一个好主意,因为导入会相互覆盖,导致混乱。在</p>