速度集
#! /bin/sh # # 0. 加载叠加剖面 # suximage <$1 ntr=$ntr f2=$cdp \ # label1="Time (sec)" label2="NTrace (xline)" \ # title="Trace Scan for CMP" windowtitle="X-Scan: $cdp" \ # cmap=rgb1 & # # 1. 获取参数 CMP、t0时间 # cmp = 1 # t0 = 2.0 # # 2. 速度集中计算v0,函数获取——插值计算 # # 根据一个cmp、t0、v0数对,计算出函数 # cmp= [225,230,235] # v1 = [[1,2,3,4,5,6],[11,12,13,14,15,16],[21,22,23,24,25,26]] # t1 = [[1,2,3,4,5,6],[11,12,13,14,15,16],[21,22,23,24,25,26]] # v = v1 + (t - t1) * (v2 - v1) / (t2 - t1) # # 3. 在CMP到集中根据offset计算出具体的CMP每一道的t时刻,offset、t0、v0 # t*2 = offset*offset/(v0*v0)+t0*t0 # 定义两个数组 array1=(1 2 3 4 5) array2=(3 4 5 6 7) # 读取输入的数值 read -p "请输入一个数值: " input_value # 查找输入数值在 array1 中的位置 index=-1 for i in "${!array1[@]}"; do if [ "${array1[$i]}" -eq "$input_value" ]; then index=$i break fi done # 根据位置在 array2 中查找对应的值 if [ "$index" -ge 0 ]; then value_in_array2="${array2[$index]}" echo "在 array1 中的位置: $index" echo "在 array2 中对应的值: $value_in_array2" else echo "输入的数值在 array1 中未找到。" fi
插值
Linux shell实现
- 给定两个数组array1=(1.1 2.2 3.3 4.4 5.5)、array2=(3.3 4.4 5.5 6.6 7.7)
- 输入一个数,如果array1中有,则从array2中找到对应位置的数
- 若果不存在,则从array1中找到该值处于接近的俩个数,这两个数的位置在array2找到对应的两个数
- 根据这四数值,使用类似于v = v1 + (t - t1) * (v2 - v1) / (t2 - t1)插值公式,计算出该值
#!/bin/bash # 定义两个数组 array1=(1.1 2.2 3.3 4.4 5.5) array2=(3.3 4.4 5.5 6.6 7.7) # 读取输入数值 read -p "请输入一个数: " input_num # 检查输入数值是否在array1中 if [[ " ${array1[@]} " =~ " $input_num " ]]; then index_array1=$(echo ${array1[@]} | tr ' ' '\n' | nl | grep -w $input_num | awk '{print $1}') corresponding_num=$(echo ${array2[$index_array1 - 1]}) echo "在array1中找到了$input_num,对应的array2中的数值为:$corresponding_num" else closest_lower="" closest_upper="" for num in "${array1[@]}"; do if (( $(bc <<< "$num < $input_num") )); then closest_lower=$num elif (( $(bc <<< "$num > $input_num") )); then closest_upper=$num break fi done index_closest_lower=$(echo ${array1[@]} | tr ' ' '\n' | nl | grep -w $closest_lower | awk '{print $1}') index_closest_upper=$(echo ${array1[@]} | tr ' ' '\n' | nl | grep -w $closest_upper | awk '{print $1}') corresponding_lower_num=$(echo ${array2[$index_closest_lower - 1]}) corresponding_upper_num=$(echo ${array2[$index_closest_upper - 1]}) interpolated_value=$(bc -l <<< "$corresponding_lower_num + ($input_num - $closest_lower) * ($corresponding_upper_num - $corresponding_lower_num) / ($closest_upper - $closest_lower)") echo "在array1中未找到$input_num,使用插值计算得到的值为:$interpolated_value" fi
根据cmp、t计算出v
Linux shell实现
- 给定三个数组cmp_arr=(225 230 235 240 245)、t_arr=(’1.1 2.2 3.3 4.4 5.5’ ’1.1 2.2 3.3 4.4 5.5’ ’1.1 2.2 3.3 4.4 5.5’)、v_arr=(’3.3 4.4 5.5 6.6 7.7’ ’3.3 4.4 5.5 6.6 7.7’ ’3.3 4.4 5.5 6.6 7.7’)
- 输入一个数,从cmp_arr进行匹配
- 如果没有,提示没有该cmp道集,现有道集为cmp_arr的所有数
- 如果有,则记录该值在cmp_arr中处于第几个位置
- 根据这个位置,在t_arr、v_arr找读取这个位置的子数组
- 输入一个数t,从t_arr进行匹配
- 如果有,则记录该值在cmp_arr中处于第几个位置,在v_arr找到该位置的数值
- 如果没有,提示没有,则从t_arr中找到该值处于接近的俩个数,这两个数的位置在v_arr找到对应的两个数
- 根据这四数值,使用类似于v = v1 + (t - t1) * (v2 - v1) / (t2 - t1)插值公式,计算出该值
#!/bin/bash cmp_arr=(225 230 235 240 245) t_arr=("1.1 2.2 3.3 4.4 5.5" "1.1 2.2 3.3 4.4 5.5" "1.1 2.2 3.3 4.4 5.5") v_arr=("3.3 4.4 5.5 6.6 7.7" "3.3 4.4 5.5 6.6 7.7" "3.3 4.4 5.5 6.6 7.7") # 输入一个数,从cmp_arr进行匹配 read -p "请输入一个数: " input_cmp index_cmp=-1 for i in "${!cmp_arr[@]}"; do if [ "${cmp_arr[i]}" -eq "$input_cmp" ]; then index_cmp=$i break fi done if [ "$index_cmp" -eq -1 ]; then echo "没有该cmp道集,现有道集为: ${cmp_arr[*]}" else t_subarr=(${t_arr[index_cmp]}) v_subarr=(${v_arr[index_cmp]}) # 输入一个数t,从t_arr进行匹配 read -p "请输入一个数t: " input_t index_t=-1 for i in "${!t_subarr[@]}"; do if [ "$(bc <<< "${t_subarr[i]} == $input_t")" -eq 1 ]; then index_t=$i break fi done if [ "$index_t" -ne -1 ]; then corresponding_v=${v_subarr[index_t]} echo "在t_arr中找到了输入的数t,对应的v值为: $corresponding_v" else closest_lower="" closest_upper="" for t in "${t_subarr[@]}"; do if (( $(bc <<< "$t < $input_t") )); then closest_lower=$t elif (( $(bc <<< "$t > $input_t") )); then closest_upper=$t break fi done index_closest_lower=$(echo ${t_subarr[@]} | tr ' ' '\n' | nl | grep -w $closest_lower | awk '{print $1}') index_closest_upper=$(echo ${t_subarr[@]} | tr ' ' '\n' | nl | grep -w $closest_upper | awk '{print $1}') corresponding_lower_v=${v_subarr[index_closest_lower - 1]} corresponding_upper_v=${v_subarr[index_closest_upper - 1]} interpolated_v=$(bc -l <<< "$corresponding_lower_v + ($input_t - $closest_lower) * ($corresponding_upper_v - $corresponding_lower_v) / ($closest_upper - $closest_lower)") echo "在t_arr中未找到输入的数t,使用插值计算得到的v值为:$interpolated_v" fi fi
反NMO
suwind < data-tm-flt-dec-bal-cdp-nmo.su key=offset min=0 | sunmo vnmo=1500 | suxwigb
suwind < data-tm-flt-dec-bal-cdp-nmo-stat.su key=offset min=0 | sunmo vnmo=1500 | suxwigb