2015-05-27 3 views
2

Я хотел бы построить контурные линии для этой функции, однако я не могу найти полезный способ сделать это.Построение функции трех переменных в python

Потенциальная функция: V(x,y,z) = cos(10x) + cos(10y) + cos(10z) + 2*(x^2 + y^2 + z^2)

я безуспешно пытался что-то вроде:

import numpy 
import matplotlib.pyplot.contour 

def V(x,y,z): 
    return numpy.cos(10*x) + numpy.cos(10*y) + numpy.cos(10*z) + 2*(x**2 + y**2 + z**2) 

X, Y, Z = numpy.mgrid[-1:1:100j, -1:1:100j, -1:1:100j] 

Но тогда, я не знаю, как сделать следующий шаг, чтобы построить ее?

matplotlib.pyplot.contour(X,Y,Z,V) 
+1

Я не уверен, что у python есть прямой инструмент для этого, но вы можете выбрать несколько значений, например, z, и сделать отдельный график контура для каждого значения, предоставляя вам изображение общей функции. См. Эту ссылку для некоторых идей: http://mathematica.stackexchange.com/questions/25277/visualize-plot-of-a-function-of-3-variables-using-color-and-contours – dermen

+0

Можете ли вы уточнить о том, что вы подразумеваете под «сюжетными линиями»? Если это функция из трех переменных, вам понадобится четвертый, чтобы показать x, y, z и V (x, y, z). , , –

+0

Я думаю, что построение четырехмерных данных (три аргумента и потенциала) в трехмерном пространстве не сработает. В корне. Нет способа уменьшить размерность проблемы, например. используя теорему Букингема-Пи, т. е. неизмеримые некоторые переменные? Если «нет» и «X, Y, Z» - это всего лишь ложные аргументы, а не декартовы компоненты, вам, вероятно, придется прибегать к нескольким сериям (упомянутым дерменем), видео, разбросам участков с различными размерами, цветному кодированию или проецированию на 'X, Y, Z', поэтому построим« V (X, Y) »,« V (Y, Z) »и« V (X, Z) »отдельно. –

ответ

3

ошибка будет возникать при попытке передать contour трехмерные массивы, так как она ожидает, что двумерные массивы.

Имея это в виду, попробуйте:

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
from matplotlib import cm 
import numpy as np 

def V(x,y,z): 
    return np.cos(10*x) + np.cos(10*y) + np.cos(10*z) + 2*(x**2 + y**2 + z**2) 

X,Y = np.mgrid[-1:1:100j, -1:1:100j] 
Z_vals = [ -0.5, 0, 0.9 ] 
num_subplots = len(Z_vals) 

fig = plt.figure(figsize=(10,4)) 
for i,z in enumerate(Z_vals) : 
    ax = fig.add_subplot(1 , num_subplots , i+1, projection='3d', axisbg='gray') 
    ax.contour(X, Y, V(X,Y,z) ,cmap=cm.gnuplot) 
    ax.set_title('z = %.2f'%z,fontsize=30) 
fig.savefig('contours.png', facecolor='grey', edgecolor='none') 

enter image description here

Вы можете использовать вместо contourf, чтобы показать поверхности, что выглядит лучше, на мой взгляд.

enter image description here

Немного разработки (которая, вероятно, выходит за рамки переполнения стека, но может помочь объяснить предыдущий код):

Как вы знаете, не существует прямой способ визуализировать функцию из 3 переменных, поскольку это объект (поверхность), который живет в 4 измерениях. Вместо этого нужно играть с кусочками функции, чтобы увидеть, что происходит. На срезе я имею в виду проекцию функции на более низкое пространственное пространство. Срез достигается путем установки одной или нескольких переменных функции в качестве константы.

+0

Спасибо за ваш ответ! Это было полезно! – user3412058

Смежные вопросы