2017-06-01 2 views
0

Je souhaite utiliser streamline pour afficher un champ vectoriel. Le champ vectoriel est singulier dans un point. Je veux enlever les régions proches de la singularité (par exemple les régions dont la distance à la singularité est inférieure à 1). J'ai écrit du code ci-dessous mais ça ne montre rien. Quelqu'un pourrait-il m'aider?La sortie de streamline dans Matlab est vide

clear all; 
close all; 
r1 = 1; r2 = 5; % Radii of your circles 
x_0 = 0; y_0 = 0; % Centre of circles 
[x,y] = meshgrid(x_0-r2:0.2:x_0+r2,y_0-r2:0.2:y_0+r2); % meshgrid of points 

idx = ((x-x_0).^2 + (y-y_0).^2 > r1^2 & (x-x_0).^2 + (y-y_0).^2 < r2^2); 
x = sort(x(idx)); 
[x, index] = unique(x); 
y = sort(y(idx)); 
[y, index] = unique(y); 
U=cos(x)/sqrt(x.^2+y.^2); 
V=sin(x)/sqrt(x.^2+y.^2); 
streamslice(x,y,U,V); 
+0

@Wolfie pouvez-vous s'il vous plaît aider? Je suis sûr que vous êtes celui qui pourrait répondre à ces questions –

+0

Ce * still * ne concerne pas le développement de MATLAB GUI. La balise [tag: matlab-guide] ne devrait pas être ici. – beaker

+0

J'ai modifié la question. Savez-vous quel est le problème? @gobelet –

Répondre

2

Le problème avec votre code est que U et V sont tous des zéros, vous obtenez un espace blanc. La raison en est que vous n'utilisez pas la division par éléments avec ./. Donc, comme une première étape, vous devez écrire:

U = cos(x)./sqrt(x.^2+y.^2); 
V = sin(x)./sqrt(x.^2+y.^2); 

Maintenant U et V ne sont pas des zéros, mais ne sont pas non plus les matrices, donc ils ne sont pas une entrée valable pour streamslice. La raison en est que x et y sont convertis en vecteurs lors de l'appel:

x = sort(x(idx)); 
y = sort(y(idx)); 

Je pense que vous pouvez supprimer tout cela l'indexation, et il suffit d'écrire:

r1 = 1; r2 = 5; % Radii of your circles 
x_0 = 0; y_0 = 0; % Centre of circles 
[x,y] = meshgrid(x_0-r2:0.2:x_0+r2,y_0-r2:0.2:y_0+r2); % meshgrid of points 
U = cos(x)./sqrt(x.^2+y.^2); 
V = sin(x)./sqrt(x.^2+y.^2); 
streamslice(x,y,U,V); 

si vous obtenez:

streamslice

0

Je pense que vous avez mal compris le concept de streamslice. Est-ce que vous vous attendez?

close all; 
r1 = 1; r2 = 5; % Radii of your circles 
x_0 = 0; y_0 = 0; % Centre of circles 
[xx,yy] = meshgrid(x_0-r2:0.2:x_0+r2,y_0-r2:0.2:y_0+r2); % meshgrid of points 

% idx = ((xx-x_0).^2 + (yy-y_0).^2 > r1^2 & (xx-x_0).^2 + (yy-y_0).^2 < r2^2); 
% x = sort(xx(idx)); 
% [x, index] = unique(x); 
% y = sort(yy(idx)); 
% [y, index] = unique(y); 
U=cos(xx)./sqrt(xx.^2+yy.^2); 
V=sin(xx)./sqrt(xx.^2+yy.^2); 
streamslice(xx,yy,U,V);