颤抖不画箭头只是很多蓝色,matlab

时间:2011-09-15 18:13:38

标签: matlab

当我没有真正得到箭头时,有人可以告诉我我在做箭头绘图功能时做错了吗?它只是填充了大量蓝色的空白空间。看看下面的图像,然后看看我的代码。 / p>

这只是我轮廓的一部分,因为如果我试图把它画得更大,这就会占用过多的力量。但是我的功能,轮廓和其他一切都有效,它只是我遇到麻烦的箭袋。

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;

2 个答案:

答案 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属性并尝试解决问题。

答案 1 :(得分: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;

这将仅显示幅度> gt的向量。 0.1;