您需要確定函數的最小值(在參數化時)(x =整數+0.25,y =整數+0.75)或反過來。然後,您可以簡單地使用球座標對球體進行參數化(例如,在此處完成:python matplotlib: drawing 3D sphere with circumferences)並繪製球體。
現在到了一些好消息和一個壞消息:
1)好消息是,最小值是正確的決定,且已創建的球體。在下面的圖中,您可以看到它們正好在曲面圖的藍色部分上方(藍色部分的確顯示了最小值)。 2)壞消息是,你會很難找到球體實際上正確渲染的另一個角度。我不知道這個相當惱人的行爲的解決方案,因此,您可能需要四處遊玩,直到找到正確的角度。玩的開心!
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def func(x, y):
return np.sin(2*np.pi*x)*np.sin(2*np.pi*y)/3
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = y = np.arange(-2.0, 2.0, 0.05)
# Get the minima of the function.
minsx1 = np.arange(int(np.amin(x)) + 0.25, int(np.amax(x)) + 0.25 + 1, 1)
minsy1 = np.arange(int(np.amin(y)) + 0.75, int(np.amax(y)) + 0.75 + 1, 1)
minsx2 = np.arange(int(np.amin(x)) + 0.75, int(np.amax(x)) + 0.75 + 1, 1)
minsy2 = np.arange(int(np.amin(y)) + 0.25, int(np.amax(y)) + 0.25 + 1, 1)
X, Y = np.meshgrid(x, y)
zs = np.array([func(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])
Z = zs.reshape(X.shape)
# Color map for better detection of minima (blue)
ax.plot_surface(X, Y, Z, cmap="viridis")
ax.set_zlim3d(-1,1)
# Spherical coordinates
r = 0.15
phi = np.linspace(0, 2 * np.pi, 30)
theta = np.linspace(0, np.pi, 30)
# Write spherical coordinates in cartesian coordinates.
x = r * np.outer(np.cos(phi), np.sin(theta))
y = r * np.outer(np.sin(phi), np.sin(theta))
z = r * np.outer(np.ones(np.size(phi)), np.cos(theta))
# Plot the spheres.
for xp in minsx1:
for yp in minsy1:
sphere = ax.plot_surface(x+xp, y+yp, z+0.35, color='r')
for xp in minsx2:
for yp in minsy2:
sphere = ax.plot_surface(x+xp, y+yp, z+0.35, color='r')
ax.view_init(elev=90, azim=0)
plt.savefig('test.png')
plt.show()
![enter image description here](https://i.stack.imgur.com/gtui3.png)
也許你想提的問題所在。我想通過一點搜索你會發現如何繪製一個球體。那麼,繪製更多的領域也不應該成爲一個問題,也不應該把它們放在某個位置上。對於實際問題的細節越多,獲得幫助的可能性就越高。否則,人們可能會將這個問題理解爲「請爲我做的工作」,這是許多人過敏的原因。 – ImportanceOfBeingErnest
那不是我的意圖。我不認爲發佈失敗的嘗試對於「似乎」不會花費很長時間的人知道他們在做什麼 - 但在將來注意到的問題上是有用的。可悲的是,正如ml4294的答案所強調的,似乎這個問題在matplotlib中是無法解決的。 –