如何将1/r、1/r²、1/r³衰减线与实测速度曲线在log-log图中对齐叠加
问题解决方法
你之前尝试用减法下移衰减曲线无效的核心原因是你使用了双对数坐标:在双对数坐标下,形如 y = C * r^(-k)(C为常数,k=1/2/3)的函数取对数后会变成 log(y) = log(C) - k*log(r),相当于对y轴整体做垂直平移的操作对应乘常数C,而非加减数值,乘常数只会改变整个曲线的垂直位置,衰减斜率保持不变,可以完美匹配实测曲线的数值范围。你只需要给三条衰减曲线分别乘以合适的缩放系数,就能实现和实测曲线的对齐。
修改后的代码如下:
import numpy as np from scipy.io import loadmat import matplotlib.pyplot as plt # 加载mat数据 mat = loadmat('model01.mat') # 解压并降维处理避免维度不匹配问题 distar = np.array(mat['Dist_A_mm01']).squeeze() vposar = np.array(mat['Model_Posterior01_m']).squeeze() vantar = np.array(mat['Model_Anterior01_m']).squeeze() vleftar = np.array(mat['Model_Left01_m']).squeeze() vrightar = np.array(mat['Model_Right01_m']).squeeze() # 排除r=0的点避免除零错误 dd = distar[1:50] # 选对齐基准点:取dd的第一个点作为对齐参考位置,可自行替换为你想要对齐的实测曲线对应位置 ref_r = dd[0] # 这里以Posterior方向的实测速度作为对齐参考,你可以替换为其他方向的数值 ref_v = vposar[1] # 计算三条衰减曲线的缩放系数 c_1 = ref_v * ref_r ** 1 c_2 = ref_v * ref_r ** 2 c_3 = ref_v * ref_r ** 3 # 绘图 ax = plt.axes() plt.loglog(distar, vposar, label='后向速度') plt.loglog(distar, vantar, label='前向速度') plt.loglog(distar, vleftar, label='左向速度') plt.loglog(distar, vrightar, label='右向速度') # 绘制对齐后的衰减曲线,用虚线区分 plt.loglog(dd, c_1/dd, label='1/r衰减', linestyle='--') plt.loglog(dd, c_2/(dd**2), label='1/r²衰减', linestyle='--') plt.loglog(dd, c_3/(dd**3), label='1/r³衰减', linestyle='--') ax.set_title('距质心距离与速度衰减关系') ax.set_ylabel('速度 (m/s)') ax.set_xlabel('距离 (mm)') plt.legend() plt.show()
补充说明
- 如果你需要给每一条实测曲线都对应一组对齐的衰减线,只需要分别计算每条曲线对应的缩放系数即可,更换不同的
ref_v数值即可对应不同的衰减曲线,建议给每条曲线用不同的线条样式区分即可。 - 如果你需要更精准的匹配,也可以用最小二乘拟合直接计算每条实测曲线对应的最优衰减指数和缩放系数,对齐效果会更准确。
内容的提问来源于stack exchange,提问作者Sara Santos
相关产品推荐
相关产品推荐

