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