Поверхностный график matplotlib для (xy) ^ 2

Может ли кто-нибудь помочь мне с построением 3D-графика поверхности для уравнения f(x,y) = (x-y)^2

Ось Z должна представлять функцию f(x,y)

У меня есть следующая функция:

def fnc(X):
    return (X[0] - X[1]) ** 2

Здесь X представляет собой массив numpy с первым параметром как X и вторым как Y. Мне особенно нужно, чтобы это было так. Поэтому, пожалуйста, не предлагайте мне изменить подпись. ;)

Я попробовал следующее из решения this:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = y = np.linspace(-5,5,100)
X, Y = np.meshgrid(x, y)
Z = fnc1([np.linspace(-5,5,100) , np.linspace(-6,6,100)])
ax.plot_surface(X, Y, Z)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()

Однако я получаю неправильный сюжет.

Это неверный сюжет


person rapidclock    schedule 24.03.2017    source источник


Ответы (2)


Массив Z для построения должен быть двумерным массивом, точно так же, как X и Y являются двумерными массивами, так что для каждой пары значений из X и Y вы получаете ровно одну точку в Z. Поэтому имеет смысл использовать эти массивы X и Y в качестве входных данных для вашей функции fnc, Z = fnc([X,Y])

Полный код будет выглядеть так

import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D


def fnc(X):
    return (X[0] - X[1]) ** 2

fig = plt.figure()
ax = fig.add_subplot(111, projection=Axes3D.name)
x = y = np.linspace(-5,5,100)
X, Y = np.meshgrid(x, y)
Z = fnc([X,Y])
ax.plot_surface(X, Y, Z)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
ax.view_init(elev=15, azim=-118)
plt.show()

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 24.03.2017

Ваш fnc неверен. Получите свою поверхность так же, как Z=(X-Y)**2. Это лучшее решение, потому что все вычисления Z будут векторизованы.

import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = y = np.linspace(-5,5,100)
X, Y = np.meshgrid(x, y)
Z = (X-Y)**2
ax.plot_surface(X, Y, Z)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()

введите здесь описание изображения

person Serenity    schedule 24.03.2017
comment
Можете ли вы рассказать мне, как вы получили свое видение сюжета? - person rapidclock; 25.03.2017
comment
Поверните его мышью - person Serenity; 25.03.2017
comment
Функция fnc(X) как в вопросе явно правильная, почему она должна быть неправильной? Она так же векторизована, как и любая другая функция с двумя аргументами, и имеет такую ​​же производительность. - person ImportanceOfBeingErnest; 25.03.2017