Как отобразить контурный график параметрической функции в Python?

#python #matplotlib

#python #matplotlib

Вопрос:

У меня есть функция, g(psi, k) где psi это массив из двух компонентов и k это реальный параметр. Я хотел бы отобразить g функцию на 3D контурном графике относительно координат, psi заданных выбранным параметром k . Как я могу сделать это на Python?

Я попытался использовать функцию contour3D с функцией-оболочкой следующим образом:

 import numpy as np
import matplotlib.pyplot as plt

k = 32 # Change this value to display different plots

# Wrapper of the g function
def f(x, y):
    psi = np.array([x, y])
    return g(psi, k)

x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
plt.show()
  

Но я получаю следующую ошибку относительно строки Z = f(X, Y) :

Ошибка значения: установка элемента массива с последовательностью.

Запуск просто:

 print(f(-0.33, -0.5))
  

Я получаю реальное значение, как и ожидалось:

 28.08105396614395
  

Как я могу это исправить? Есть ли какой-либо другой способ более простого отображения графика g(psi, 32) ?

Ответ №1:

Ваша функция, g(psi, k) вероятно, работает только с psi одномерным массивом, что означает, что только x и y являются скалярами. Либо вызывайте f в цикле, либо векторизируйте g функцию. Вот как вызвать функцию f в цикле:

 Z = np.empty(shape=(X.shape))
for row, (xx, yy) in enumerate(zip(X,Y)):          # into rows
    for col, (xxx, yyy) in enumerate(zip(xx,yy)):  # rows to single values
        Z[row, col] = f(xxx, yyy)
  

Комментарии:

1. Да, я подтверждаю то, что вы написали о g функции 🙂 ваш обходной путь работает, спасибо! Я дал ему 1, но я подожду еще немного, чтобы подтвердить его как правильный ответ. Я надеюсь, что есть более компактный способ сделать это. Еще раз спасибо!