Forum: PC Hard- und Software Matlab Vektorfeld


von M. M. (blackcow)


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?

von Jan K. (jan_k)


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

: Bearbeitet durch User
von Anonymous U. (gastt)


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.

: Bearbeitet durch User
von Anonymous U. (gastt)


Lesenswert?

Ich muss ein meshgrid erzeugen, das zu meinem Array passt und die 
zugehörige Matrix dann mit dem meshgrid und meinem Array berechnen öder?

von Jan K. (jan_k)


Lesenswert?

Hast du deine Gradienten gegeben oder willst du die berechnen?

von M. M. (blackcow)


Angehängte Dateien:

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!

von Jan K. (jan_k)


Lesenswert?

Ist das schon Matlab 2014b?

Und irgendwie weicht die Aufgabenstellung etwas von oben ab ;-)
Ich fragte ja mehrmals, wie die Daten angeordnet sind und schrieb auch, 
dass du vermutlich ein meshgrid erzeugen musst. Wieso musstest du was 
umordnen?

von Anonymous U. (gastt)


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.

von aqua (Gast)


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.

von M. M. (blackcow)


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;

von aqua (Gast)


Lesenswert?

vielen dank.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.