在 matlab 中的 3d 轴上绘制 2d 矢量

Plotting a 2d vector on 3d axes in matlab

我有三个向量 x,y,t。对于每个组合 x,y,t 都有一个 (u,v) 值与之关联。如何在matlab中绘制这个?实际上我正在尝试绘制二维双曲方程的解 vt = A1vx + A2 vy 其中 A1 和 A2 是 2*2 矩阵,v 是 2*1向量。我正在尝试 scatter3 和 quiver3 但作为 matlab 的新手我无法正确表示解决方案。 在下面的代码中,我只在特定的时间级别绘制了图。如何在一个图中显示完整的解决方案?有什么帮助吗?

A1 = [5/3 2/3; 1/3 4/3];
A2 = [-1 -2; -1 0];
M = 10;
N = 40;
delta_x = 1/M;
delta_y = delta_x;
delta_t = 1/N;
x_points = 0:delta_x:1;
y_points = 0:delta_y:1;
t_points = 0:delta_t:1;

u = zeros(M+1,M+1,N+1,2);
for i=1:M+1,
    for j=1:M+1,
        u(i,j,1,1) = (sin(pi*x_points(i)))*sin(2*pi*y_points(j)) ;
        u(i,j,1,2) = cos(2*pi*x_points(i));
    end
end

for j=1:M+1,
    for t=1:N+1,
        u(M+1,j,t,1) = sin(2*t);
        u(M+1,j,t,2) = cos(2*t);
    end
end

for i=1:M+1
    for t=1:N+1
        u(i,1,t,1) = sin(2*t);
        u(i,M+1,t,2) = sin(5*t) ;
    end
end

Rx = delta_t/delta_x;
Ry = delta_t/delta_y;

for t=2:N+1
    v = zeros(M+1,M+1,2);
    for i=2:M,
        for j=2:M,
            A = [(u(i+1,j,t-1,1) - u(i-1,j,t-1,1)) ; (u(i+1,j,t-1,2) - u(i-1,j,t-1,2))];
            B = [(u(i+1,j,t-1,1) -2*u(i,j,t-1,1) +u(i-1,j,t-1,1)) ; (u(i+1,j,t-1,2) -2*u(i,j,t-1,2) +u(i-1,j,t-1,2))];
            C = [u(i,j,t-1,1) ; u(i,j,t-1,2)];
            v(i,j,:) = C + Rx*A1*A/2 + Rx*Rx*A1*A1*B/2;
        end
    end
    for i=2:M,
        for j=2:M,
            A = [(v(i,j+1,1) - v(i,j-1,1)) ; (v(i,j+1,2) - v(i,j-1,2)) ];
            B = [(v(i,j+1,1) - 2*v(i,j,1) +v(i,j-1,1)) ; (v(i,j+1,2) - 2*v(i,j,2) +v(i,j-1,2))];
            C = [v(i,j,1) ; v(i,j,2)];
            u(i,j,t,:) = C + Ry*A2*A/2 + Ry*Ry*A2*A2*B/2;
        end
    end
if j==2
    u(i,1,t,2) = u(i,2,t,2);
end
if j==M
    u(i,M+1,t,1) = u(i,M,t,1); 
end

if i==2
    u(1,j,t,:) = u(2,j,t,:) ;
end
end

time_level = 2;
quiver(x_points, y_points,  u(:,:,time_level,1), u(:,:,time_level,2))

你可以画成3D,但我个人认为很难理解。

有一个 quiver3 等同于您的绘图函数。 z-axis 在这种情况下将是时间(例如,等距),并且向量的 z 分量将为零。与此函数的 2D 版本不同,它不支持传入坐标向量,因此您需要使用 meshgrid:

显式创建网格
sz = size(u);
[X, Y, Z] = meshgrid(x_points, y_points, 1:sz(3));
quiver3(X, Y, Z, u(:,:,:,1), u(:,:,:,2), zeros(sz(1:3)));

您也可以通过一次绘制一个时间尺度来对每个时间尺度进行不同的着色,但仍然很难理解结果:

figure(); hold('all');
for z = 1:sz(3)
    [X, Y, Z] = meshgrid(x_points, y_points, z);
    quiver3(X, Y, Z, u(:,:,z,1), u(:,:,z,2), zeros([sz(1:2),1]));
end