Python - ошибка при рисовании контурного графика с использованием scipy.integrate.quad - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь нарисовать контурный график в 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 голосов
/ 02 июня 2018

Как правильно заметил @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()

enter image description here

...