Python - 使用scipy.integrate.quad绘制等高线图时出错

时间:2018-06-02 04:16:46

标签: python matplotlib scipy contour

我试图在Python中绘制等高线图,使用比下面更复杂的代码。但是,同样的问题出现在下面的简单例子中:

import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt

def A(x):
    return integrate.quad(lambda i: x-i, 0, x)

n = 100
x = np.linspace(0, 10, n)
y = np.linspace(0, 10, n)

X, Y = np.meshgrid(x, y)
M = A(X) + Y  # THE ERROR ARISES HERE

plt.contour(X, Y, M)
plt.show()

以下错误信息显示在上面指定的行中:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我想使用integrate.quad()

任何人都可以帮助我吗? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

正如@WarrenWeckesser在评论中正确指出的那样,这两个问题是

  • quad返回一个元组,您只需要第一个成员。
  • 您要计算的积分是标量,因此您无法将2D数组传递给它。

解决方案:

  • 将“quadquad( ..., )[0]的回报编入索引,仅收取第一项
  • vectorizeA的调用,以便逐个调用数组X的所有标量。请注意,这不是很有效,但对于此处提供的100x100元素数组应该没问题。

完整的解决方案看起来像

import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt

def A(x):
    return integrate.quad(lambda i: x-i, 0, x)[0]

n = 100
x = np.linspace(0, 10, n)
y = np.linspace(0, 10, n)

X, Y = np.meshgrid(x, y)
M = np.vectorize(A)(X) + Y

plt.contour(X, Y, M)
plt.show()

enter image description here