Python - 使用 scipy.integrate.quad 绘制等高线图时出错
Python - error in drawing contour plot using scipy.integrate.quad
我正在尝试在 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()
.
谁能帮帮我?
提前致谢。
正如@WarrenWeckesser 在评论中正确指出的那样,这两个问题是
quad
returns 一个元组,你只需要这里的第一个成员。
- 您要计算的积分是标量,因此您不能将二维数组传递给它。
解决办法:
- 索引
quad
的return:quad( ..., )[0]
只取出第一项
vectorize
对 A
的调用,这样它就会与数组 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()
我正在尝试在 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()
.
谁能帮帮我? 提前致谢。
正如@WarrenWeckesser 在评论中正确指出的那样,这两个问题是
quad
returns 一个元组,你只需要这里的第一个成员。- 您要计算的积分是标量,因此您不能将二维数组传递给它。
解决办法:
- 索引
quad
的return:quad( ..., )[0]
只取出第一项 vectorize
对A
的调用,这样它就会与数组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()