Matlab Vektorfeld

OP #3926122
Lesenswert?

Hallo,

ich habe in Matlab ein 2d-Vektorfeld in Form eines Arrays vorliegen. Die 
einzelnen Vektoren(dx|dy) haben ihren Startpunkt (x|y): dx = 
Array(x,y,1); dy = Array(x,y,1).

Wie kann ich das in Matlab darstellen? Quiver geht nicht, da hier ein 
Meshgrid benötigt wird. Jemand eine Idee?
#3926138
Lesenswert?

Ich verstehe leider noch nicht genau, wie deine Daten aussehen.

Du hast zwei Vektoren dx und dy mit den Gradienten? An welchen 
Koordinaten sollen die ausgewertet werden? Sollten x und y kein grid 
sein, kannst du ja eins mit
1
[X Y]=meshgrid(x,y)
 erzeugen, aber das weißt du vermutlich schon ;-)

Wenn es nur darum geht, die Vektoren zu Matrizen zu machen, ist reshape 
dein Freund.

Schreib mal ruhig in matlab Syntax hin was du hast, vllt auch mit den 
Dimensionen :)

Schöne Grüße,
Jan
#3926360
Lesenswert?

Also ich habe ein 3-dimensionales Array berechnet, in dem Index 1 für 
die x-koordinate steht, Index 2 für die y-koordinate des startpunktes 
der einzelnen Vektoren und der 3. Index unterteilt in dx und dy, also 
die Komponenten der Vektoren. Der Eintrag ist die Länge der Komponente. 
Jetzt suche ich eine Möglichkeit dies in matlab darstellen zu können. 
Ich bin gerade unterwegs deshalb kann ich den Code nicht sofort 
reinstellen.
OP #3927220
Lesenswert?

Problem erledigt, ich habs jez zum laufen gebracht. Es geht um die 
Visualisierung des Magnetfeldes einer bewegten Ladung. Einerseits soll 
die Richtung des Feldes mit Vektoren angezeigt werden und außerdem die 
Intensität zusätzlich mit einer Einfärbung. Das berechnete Feld liegt in 
einem Array vor. Ich musste erst ein meshgrid und die zugehörigen 
Matrizen erzeugen. In die Matrizen mussten die Werte aus dem Array 
umsortiert werden. Trotzdem vielen Dank für die Hilfe!
Angehängte Dateien:
#3927888
Lesenswert?

Ja is 2014b. Das Problem ist, dass ich mehr Vektoren für die 
intensitätswerte (einfärbung) berechnet habe als ich für die angezeigten 
Vektoren brauche. Deshalb musste ich das Array auf das meshgrid 
skalieren. Ist eig keine große Sache, aber so viel hab ich mit matlab 
noch nicht gemacht.
Gast #3927899
Lesenswert?

M. M. schrieb:
> Problem erledigt, ich habs jez zum laufen gebracht. Es geht um die
> Visualisierung des Magnetfeldes einer bewegten Ladung. Einerseits soll
> die Richtung des Feldes mit Vektoren angezeigt werden und außerdem die
> Intensität zusätzlich mit einer Einfärbung. Das berechnete Feld liegt in
> einem Array vor. Ich musste erst ein meshgrid und die zugehörigen
> Matrizen erzeugen. In die Matrizen mussten die Werte aus dem Array
> umsortiert werden. Trotzdem vielen Dank für die Hilfe!

Evtl. möchtest Du Deine Lösung als Matlab Codebeispiel zeigen, damit 
andere lernen können? Würde mich auch interessieren.
OP #3928424
Lesenswert?

clc;
close all;
clear var;
clear;

%input data
Q1=[-2.1 -2.1 0]; charge1=3; direction1=[1 0 0]; speed1=1;
Q2=[2.1 2 -2]; charge2=7; direction2=[0 0.2 1]; speed2=-1.4;
%options FEM
z=0; xmax=10; ymax=10; dotsx=100; Bmax=1; vectors=30;

%calculate constants
dx = xmax/dotsx;
dotsy = ymax/dx;
velocity1=(direction1/norm(direction1))*speed1;
velocity2=(direction2/norm(direction2))*speed2;
%create array B[x,y,B] and directionB[x,y,dx,dy]
B = zeros(dotsx, dotsy);
directionB = zeros(dotsx, dotsy, 3);
%loop x
for i=1:(xmax/dx)
    %loop y
    for ii=1:(ymax/dx)
        %calculate B(x,y)
        x=(i*dx-xmax/2);
        y=(ii*dx-ymax/2);
        OP=[x y z];
        %calculate field of Q1
        OPQ1=Q1-OP;
        distance=norm(OPQ1);
        velocityorthogonal1=velocity1-(((OPQ1/distance)*velocity1')*(OPQ1/distan 
ce));
        BintensityQ1 = (charge1*norm(velocityorthogonal1))/distance^2;
        %calculate direction x,y
        dVector1=cross(OPQ1,velocity1)/norm(cross(OPQ1,velocity1));
        %calculate field of Q2
        OPQ2=Q2-OP;
        distance=norm(OPQ2);
        velocityorthogonal2=velocity2-(((OPQ2/distance)*velocity2')*(OPQ2/distan 
ce));
        BintensityQ2 = (charge2*norm(velocityorthogonal2))/distance^2;
        %calculate direction x,y
        dVector2=cross(OPQ2,velocity2)/norm(cross(OPQ2,velocity2));

        %add fieldx
        dVector=dVector1*BintensityQ1+dVector2*BintensityQ2;
        dVectorlog=(dVector/norm(dVector))*log(norm(dVector+1));
        directionB(i,ii,1)=dVectorlog*[1 0 0]';
        directionB(i,ii,2)=dVectorlog*[0 1 0]';
        directionB(i,ii,3)=dVectorlog*[0 0 1]';

        if 0 < dVector(3)
            B(ii,i) = norm(dVector);
        else
            B(ii,i) = -norm(dVector);
        end
        if Bmax < abs(B(ii,i))
            if 0>B(ii,i)
                B(ii,i) = -Bmax;
            else
                B(ii,i) = Bmax;
            end
        end
    end
end

%create meshgrids
[X1,Y1,Z1]=meshgrid(0:xmax/dotsx:xmax,0:ymax/dotsy:ymax,0);
[X2,Y2,Z2]=meshgrid(xmax/(vectors*2):xmax/vectors:xmax,ymax/(vectors*2): 
ymax/vectors:ymax,0);
%x2
for i=1:vectors
    %y2
    for ii=1:vectors
        accx=fix(-dotsx/(vectors*2)+i*dotsx/vectors);
        accy=fix(-dotsy/(vectors*2)+ii*dotsy/vectors);
        Valuesdx(ii,i)=directionB(accx,accy,1);
        Valuesdy(ii,i)=directionB(accx,accy,2);
        Valuesdz(ii,i)=directionB(accx,accy,3);
    end
end

figure(1);
axis on
axis([0 xmax 0 ymax -xmax/2 xmax/2])
hold on
h1 = surf(X1,Y1,Z1,B);
h2 = quiver3(X2,Y2,Z2,Valuesdx,Valuesdy,Valuesdz)
colormap jet
xlabel('x');
ylabel('y');
zlabel('B');
set(h1, 'FaceAlpha', 0.8, 'EdgeAlpha', 0.0)
set(h2, 'color', [0 0 0])
colorbar;
clc;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren