You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gnuplot卫星绕行动画中动态显示速度等参数值

解决Gnuplot卫星动画中实时显示速度、能量参数的问题

看起来你已经搞定了卫星轨迹的动画绘制,现在要加上速度、能量这些动态参数的展示对吧?我之前做过类似的天体力学动画,给你两种实用的方案,适配不同的展示需求:

方案1:在轨迹图上叠加实时参数文本

这种方法适合想在同一图里同时看轨迹和关键参数的场景,直接用Gnuplot的label功能实时更新数值:

完整代码示例

# 先统计数据行数,确定循环范围
stats "sat.dat" nooutput
max_steps = int(STATS_records)
dt = 0.1  # 替换成你的实际时间步长(比如每个数据点对应的时间间隔)

# 物理参数(根据你的模型调整,用无量纲单位的话可以注释掉)
G = 6.67e-11   # 引力常数
M = 5.97e24    # 行星质量(比如地球)

do for [n=0:max_steps] {
    # 获取当前步的卫星和行星位置
    curr_line = system(sprintf("sed -n %ip sat.dat", n+1))
    x_sat = word(curr_line, 3)
    y_sat = word(curr_line, 4)
    x_planet = word(curr_line, 6)
    y_planet = word(curr_line, 7)

    # 计算速度(如果数据里没有现成的速度列)
    if (n > 0) {
        prev_line = system(sprintf("sed -n %ip sat.dat", n))
        x_prev = word(prev_line, 3)
        y_prev = word(prev_line, 4)
        vx = (x_sat - x_prev)/dt
        vy = (y_sat - y_prev)/dt
        speed = sqrt(vx**2 + vy**2)
    } else {
        # 第一步用初始速度,如果你数据里有第5列是速度,直接替换成word(curr_line,5)
        speed = 7800  # 示例初始速度,比如近地轨道速度
    }

    # 计算总能量(动能+引力势能)
    r = sqrt((x_sat - x_planet)**2 + (y_sat - y_planet)**2)
    kinetic_energy = 0.5 * speed**2  # 假设卫星质量为1,按需调整
    potential_energy = -G * M / r
    total_energy = kinetic_energy + potential_energy

    # 绘制轨迹、行星,叠加参数文本
    set title "Satellite Orbit Animation"
    set xlabel "X (m)"
    set ylabel "Y (m)"
    set aspect ratio equal  # 保证轨迹不畸变
    set key left top

    plot "sat.dat" u 3:4 every ::0::n w lp ls 2 pt 6 t sprintf("Steps: %d", n), \
         "sat.dat" u 6:7 every ::n::n w p ls 1 pt 7 ps 2 t "Planet", \
         # 实时更新参数标签
         set label 1 at graph 0.05, graph 0.95 sprintf("Speed: %.1f m/s", speed) font "Helvetica,12", \
         set label 2 at graph 0.05, graph 0.90 sprintf("Total Energy: %.2e J", total_energy) font "Helvetica,12"

    pause 0.1  # 控制动画速度,越小越快
}

方案2:分栏显示轨迹+参数曲线

如果想更直观地看速度、能量随时间的变化趋势,可以用multiplot布局,左边画轨迹,右边画参数的时间曲线:

完整代码示例

stats "sat.dat" nooutput
max_steps = int(STATS_records)
dt = 0.1
G = 6.67e-11
M = 5.97e24

# 初始化临时文件存储动态参数
print "# Time(s) Speed(m/s) Total_Energy(J)" > "dynamics_temp.dat"

# 设置多图布局
set multiplot layout 1,2 title "Satellite Orbit & Dynamics"

# 轨迹子图设置
set origin 0,0
set size 0.45,1
set xlabel "X (m)"
set ylabel "Y (m)"
set aspect ratio equal
set key left top

# 参数曲线子图设置
set origin 0.55,0
set size 0.45,1
set xlabel "Time (s)"
set ylabel "Value"
set key right top
set yrange [-1e9:1e6]  # 根据你的能量范围调整

do for [n=0:max_steps] {
    curr_line = system(sprintf("sed -n %ip sat.dat", n+1))
    x_sat = word(curr_line,3)
    y_sat = word(curr_line,4)
    x_planet = word(curr_line,6)
    y_planet = word(curr_line,7)
    current_time = n * dt

    # 计算速度和能量
    if (n>0) {
        prev_line = system(sprintf("sed -n %ip sat.dat", n))
        vx = (x_sat - word(prev_line,3))/dt
        vy = (y_sat - word(prev_line,4))/dt
        speed = sqrt(vx**2 + vy**2)
    } else {
        speed = 7800
    }
    r = sqrt((x_sat - x_planet)**2 + (y_sat - y_planet)**2)
    total_energy = 0.5*speed**2 - G*M/r

    # 写入临时参数文件
    print sprintf("%.2f %.1f %.2e", current_time, speed, total_energy) >> "dynamics_temp.dat"

    # 绘制轨迹子图
    plot "sat.dat" u 3:4 every ::0::n w lp ls 2 t sprintf("Steps: %d", n), \
         "sat.dat" u 6:7 every ::n::n w p ls 1 pt 7 ps 2 t "Planet"

    # 绘制参数曲线子图
    plot "dynamics_temp.dat" u 1:2 w lp ls 3 t "Speed", \
         "dynamics_temp.dat" u 1:3 w lp ls 4 t "Total Energy"

    pause 0.1
}

unset multiplot
# 清理临时文件(可选)
!rm dynamics_temp.dat

关键优化提示

  1. 如果数据里已有速度/能量列:直接用对应的列号读取,不用计算,比如speed = word(curr_line,5)(假设第5列是速度),效率更高。
  2. 大数据量优化:如果你的数据文件很大,反复调用sed会很慢,建议用Gnuplot的数组提前加载所有数据:
    array x_sat[max_steps+1]
    array y_sat[max_steps+1]
    array x_planet[max_steps+1]
    do for [i=0:max_steps] {
        line = system(sprintf("sed -n %ip sat.dat", i+1))
        x_sat[i] = word(line,3)
        y_sat[i] = word(line,4)
        x_planet[i] = word(line,6)
    }
    
    之后循环里直接用x_sat[n]调用,速度会快很多。
  3. 单位适配:如果用的是无量纲模拟,直接去掉物理常数,用你模型里的单位计算即可。

内容的提问来源于stack exchange,提问作者SofaScientist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:34:45