Я пытаюсь нарисовать контурный график на 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 Спасибо за ваш комментарий.
@ Mr.T Я искал фигуру, подобную той, что была в ответе на ImportanceOfBeingEarnest. Спасибо, в любом случае.






Как правильно указал @WarrenWeckesser в комментариях, две проблемы:
quad возвращает кортеж, из которого вам понадобится только первый член.Решения:
quad: 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()
Две проблемы: (1) по умолчанию
quadвозвращает значения два (см. строка документации); (2) пределы интегрирования должны быть скалярами, а не массивами.