Построение x ^ 2 + y ^ 2 = z ^ 2 = 1 с использованием matplotlib без параметров c - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу построить единичную сферу x ^ 2 + y ^ 2 + z ^ 2 = 1 и пытаюсь использовать sympy, numpy и matplotlib для того же самого. Ниже приведен фрагмент кода:

x,y = sp.symbols('x y')

def g(x,y):
    return sqrt(1-x**2 - y**2)
xrange2 = np.linspace(-1, 1, 100)
yrange2 = np.linspace(-1, 1, 100)
X2, Y2 = np.meshgrid(xrange2, yrange2)
Z2 = g(X2, Y2)
Z2[(1- X2**2 - Y2**2 < 0)] = np.nan
Z2[(1- X2**2 - Y2**2 > 0)] = np.nan
ax.plot_surface(X2, Y2, Z2,cmap='Blues', antialiased=True, edgecolor='black')

Я не буду sh использовать параметрические уравнения c для сферы, а построю график, используя x, y и z. В настоящее время получается ошибка ниже: Z содержит значения NaN. Это может привести к артефактам рендеринга.

1 Ответ

1 голос
/ 27 апреля 2020

Из вопроса очень непонятно, какая версия sqrt используется. Sympy's sqrt определенно не будет работать. math.sqrt не работает с массивами. Только np.sqrt может работать. Но тогда функция g должна быть numpy векторизованной.

np.sqrt работает с массивами и дает NaN при работе с отрицательными числами.

ax.plot_surface не делает Если вы хотите рисовать цветные грани, когда некоторые значения Z равны NaN, то в этом случае используются только простые цвета aws. Обратите внимание, что сглаживание не работает для построения граней, только для ребер.

Чтобы нарисовать полную сферу, необходимо нарисовать как Z2, так и -Z2.

Из-за NaN s и уравнение, которое не определяет равномерно распределенные точки, будут присутствовать некоторые артефакты. Кроме того, поверхности не будут полностью заполняться. См. этот пост , чтобы нарисовать сферу с помощью angular представления.

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

@np.vectorize
def g(x,y):
    return np.sqrt(1-x**2 - y**2)

fig = plt.figure()
ax = fig.gca(projection='3d')

xrange2 = np.linspace(-1, 1, 100)
yrange2 = np.linspace(-1, 1, 100)
X2, Y2 = np.meshgrid(xrange2, yrange2)
Z2 = g(X2, Y2)
ax.plot_surface(X2, Y2, -Z2, color='lightblue', antialiased=True, edgecolor='black')
ax.plot_surface(X2, Y2, Z2, color='lightblue', antialiased=True, edgecolor='black')

plt.show()

resulting plot

PS: обратите внимание, что вы на самом деле не использует sympy в коде (def g(x,y) использует собственную версию стандартных Python переменных x и y). Кроме того, смешивание numpy и sympy не работает. Этот связанный пост обрабатывает построение поверхности как параметр c поверхности через sympy. Обратите внимание, что эти параметры c поверхностей работают только для 2 переменных, в этом случае x, y и z определяются в зависимости от фи и тета. Насколько я знаю, построение общего трехмерного уравнения в данный момент не работает с симпати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...