2017-03-24 32 views
1

は、誰もがf(x,y) = (x-y)^2matplotlibの表面プロット(XY)^ 2

Z軸は関数f(x、y)を表すべき方程式の3次元表面プロットをプロットで私を助けることができる

私が持っています機能下記

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

ここでXは、X及びIは、特にそれがこのようである必要はY. としての第2として、第1のパラメータとnumpyのアレイです。ですから、署名を変更するように私に提案してはいけません。 ;)

私は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() 

This is a wrong plot though

答えて

0

プロットする配列ZXからの値の各ペアのためとYあなたが正確に一つのポイントを得るように、XYが2Dアレイであると同じように、2次元アレイであるべきですZ。したがって、あなたのfnc関数への入力として、それらの配列XYを使用することは理にかなって、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() 

enter image description here

1

あなた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() 

enter image description here

+0

次のようになり、あなたはあなたがあなたの視点を得た方法を教えてもらえますプロット? – rapidclock

+0

マウスで回転する – Serenity

+0

質問にある 'fnc(X)'関数は明らかに正しいですが、なぜ間違っているのでしょうか?他の2つの引数関数と同じように「ベクトル化」され、同じ性能を持ちます。 – ImportanceOfBeingErnest

関連する問題