GNU Octave中plot3仅显示坐标轴无数据点的问题咨询
问题解决:GNU Octave 3D绘图仅显示坐标轴无数据点
你当前的代码在循环中每次只绘制单个点,但plot3默认以连线方式绘图,单个孤立点没有前后坐标支撑,所以无法显示。而2D的plot可能在你使用时因为数据积累后形成了可见的连线,才让你觉得正常。
两种可行的修改方案:
方案1:先存储所有数据,循环结束后一次性绘制轨迹
先初始化数组来存储所有计算出的x、y、z坐标,循环时把每一步的坐标追加到数组中,最后用完整的数组绘制连续轨迹:
t=0; dt = 0.1; % 初始化数组存储所有坐标 x = [0]; y = [0]; z = [0]; vx=40; vy=15; vz=15; m=0.43; g=9.81; rho=0.9982; Cw=0.47; A=0.03789; while (z(end)>=0) Fwlx = 0.5*Cw*A*rho*(vx)^2; Fwly = 0.5*Cw*A*rho*(vy)^2; Fwlz = 0.5*Cw*A*rho*(vz)^2; Fz = m*g; Fresx = -Fwlx; Fresy = -Fwly; Fresz = -Fwlz-Fz; ax = Fresx/m; ay = Fresy/m; az = Fresz/m; vx = vx + ax*dt; vy = vy + ay*dt; vz = vz + az*dt; % 追加新坐标到数组 x = [x, x(end) + vx*dt]; y = [y, y(end) + vy*dt]; z = [z, z(end) + vz*dt]; t = t + dt; end % 循环结束后一次性绘制完整轨迹 plot3(x, y, z) grid on % 可选,添加网格让坐标轴更清晰
方案2:实时绘制单个点,指定点样式
如果你需要在循环中实时看到每个点的绘制,需要给plot3指定点标记样式,比如用'o'表示圆点:
t=0; dt = 0.1; x=0; y=0; z=0; vx=40; vy=15; vz=15; m=0.43; g=9.81; rho=0.9982; Cw=0.47; A=0.03789; hold on % 提前开启hold on,避免每次重置绘图 grid on % 可选,添加网格 while (z>=0) Fwlx = 0.5*Cw*A*rho*(vx)^2; Fwly = 0.5*Cw*A*rho*(vy)^2; Fwlz = 0.5*Cw*A*rho*(vz)^2; Fz = m*g; Fresx = -Fwlx; Fresy = -Fwly; Fresz = -Fwlz-Fz; ax = Fresx/m; ay = Fresy/m; az = Fresz/m; vx = vx + ax*dt; vy = vy + ay*dt; vz = vz + az*dt; x = x + vx*dt; y = y + vy*dt; z = z + vz*dt; t = t + dt; % 指定点样式绘制单个点 plot3(x, y, z, 'ro', 'MarkerSize', 2) drawnow % 强制刷新绘图窗口,实时显示点 end hold off
补充说明
- 方案1的效率更高,适合数据量较大的情况,绘制的是连续的轨迹线;
- 方案2适合需要实时观察每一步计算结果的场景,但频繁绘制单个点会稍微降低运行效率。
内容的提问来源于stack exchange,提问作者Loci
相关产品推荐
相关产品推荐

