2011-09-15 74 views
2

有人可以告訴我我做什麼錯誤的顫抖繪圖功能,當我沒有真正得到箭頭,它只是充滿了空間有很多藍色。查看下面的圖片,然後看看我的代碼。顫動沒有繪製箭頭只是很多藍色,matlab

這只是我的輪廓的一部分,因爲如果我嘗試繪製更大的圖像,這會消耗更多的能量。但是我的功能,輪廓和其他一切都起作用,這只是我遇到麻煩的顫抖。

Matlab plot

interval = -100:100; 

[X Y] = meshgrid(interval, interval); 

h = figure; 
contour(X, Y, Z); 

hold on; 

[FX,FY] = gradient(-Z); 
quiver(X, Y, FX, FY); 

hold off; 

如果我讓我的矩陣更稀疏,例如「interval = linspace(-800,1600,1200);」結果將如下所示: enter image description here

編輯: 我需要的是這樣的輪廓線,但箭頭應該與他們一起流動。現在這些只是看起來像點,即使我進一步放大。如果我縮小整個窗口將是藍色的。

這是腳本的全部內容,如果有人想玩它來弄清楚這一點。

m1 = 1; 
m2 = 0.4; 
r1 = [1167 0 0]; 
r2 = [-467 0 0]; 
G = 9.82; 

w = sqrt(G*(m1+m2)/norm(r1-r2)^3); 

interval = linspace(-800, 1600, 1200); 

% Element-wise 2-norm 
ewnorm = @(x,y) (x.^2 + y.^2).^(1/2); 

% Element-wise cross squared 
ewcross2 = @(w,x,y) w^2.*(x.*x + y.*y); 

[X Y] = meshgrid(interval, interval); 

Z = - G*m1 ./ ewnorm(X-r1(1), Y-r1(2)) - G*m2 ./ ewnorm(X-r2(1), Y-r2(2)) - 1/2*ewcross2(w,X,Y); 

h = figure; 
contour(Z); 

daspect([1 1 1]); 

saveas(h, 'star1', 'eps'); 

hold on; 

[FX,FY] = gradient(-Z); 
quiver(X, Y, FX,FY); 

hold off; 
+0

什麼是Z的定義? –

+0

只是一個公式,因爲我得到預期的輪廓。 –

回答

5

問題是網格太密集。您只需要儘可能少的元素來生成有用的網格。因此,儘量減少網格的密度:

interval = -100:2:100 

如果你打算要經常更換的限制,你可能要避免使用X:Y:Z配方。使用linspace函數:

interval = linspace(-100,100,10); 

這將確保無論什麼自己的極限,你的模型將是10x10。在下面的評論中,你提到當你使用一個非常大的網格時箭頭出現爲點。這是可以預料的。箭頭反映給定點處的「速度」。當你的情節放大到非常大的程度時,情節中任何給定點的速度幾乎爲0,因此非常小的箭頭。查看quiver plot documentation以及quivergroup properties,查看更多詳細信息。

如果你絕對必須在大規模見箭頭,你可以嘗試AutoScale屬性設置爲off,或增加AutoScaleFactor

quiver(X, Y, FX, FY, 'AutoScale', 'off'); 
quiver(X, Y, FX, FY, 'AutoScaleFactor', 10); 

您可能還需要與MarkerSizeMaxHeadSize性能發揮。我真的只是建議看看所有的QuiverGroup屬性並嘗試一下。

+0

如果我做了-100:20:100,我得到了合理的箭頭。然而,當試圖用-800:1600的間隔做同樣的事情時,我沒有太多成功......我只是得到了點。 –

+0

@calle - 您的新網格太密集,請參閱修改後的答案。 – eykanal

+0

我在帖子中添加了更多信息。我嘗試了很多不同的密度,但無法解決這個問題。 –

1

你可以使用一個閾值

interval = -100:100; 

[X Y] = meshgrid(interval, interval); 

h = figure; 
contour(X, Y, Z); 

hold on; 

[FX,FY] = gradient(-Z); 
GM = sqrt(FX.^2 + FY.^2); 
threshold = 0.1; 
mask = GM > threshold; 
quiver(X(mask), Y(mask), FX(mask), FY(mask)); 

hold off; 

這將只顯示與矢量的量值> 0.1;