Пример #1
0
def VIB_correlation_Calculator(VIBname, VIBtime):
    '''
    计算名为VIBname的振动数据与其他振动数据在VIBtime架次的Pearson's corrletion
    返回2个变量corr_list, col_list
    corr_list: 相关性系数
    col_list: 与相关性系数对应的变量名
    (corr_list[i]为col_list[i]与VIBname的Person's Correlation)
    返回值类型均为list
    '''
    fileList = printFiles()  # 读取全部文件名

    corList = []  # 初始化corList为空
    colList = []  # 初始化colList为空

    VIBList = findFolder(VIBname)  # 将VIBname所在的数据包名称存入VIBList变量
    for i in range(len(VIBList)):  # 搜索VIBList
        if (VIBtime in VIBList[i]):  # 如果检索到VIBtime架次
            VIBtarget = readData(VIBList[i], VIBname)  # 读取目标振动响应数据

    for i in range(len(fileList)):  # 搜索fileList

        if (VIBtime in fileList[i]):  # 如果搜索至的fileList变量包含VIBtime(架次)
            filenameStr = fileList[i]  # 提取该文件名称
            if (filenameStr.endswith("00VIB-ANA003-512_new.txt")
                ):  # 如果文件名以"00VIB-ANA003-512_new.txt"结尾
                print("00VIB-ANA003-512 Fetching Started!"
                      )  # 告知开始提取"00VIB-ANA003-512_new.txt"的变量

                columns_ANA003 = printColumns(filenameStr)  # 提取该数据包中的变量名称
                print("In total of " + str(len(columns_ANA003)) +
                      " columns")  # 告知一共有多少变量

                for j in range(1, len(columns_ANA003)):  # 搜索变量名称

                    print("Start " + str(j) + "/" +
                          str(len(columns_ANA003)))  # 告知已开始某变量的计算
                    jCol = readData(filenameStr,
                                    columns_ANA003[j])  # 读取该变量代表振动数据

                    corrJ = scs.pearsonr(
                        jCol, VIBtarget)[0]  # 计算该振动数据与目标振动数据间的皮尔逊相关系数
                    corList.append(corrJ)  # 将计算好的相关系数加入corList
                    colList.append(columns_ANA003[j])  # 将变量名称加入colList
                    print("Correlation between " + columns_ANA003[j] +
                          " and " + VIBname + " is " +
                          str(corrJ))  # 告知变量名称和相关性系数

                print("00VIB-ANA003-512 Fetching complete!"
                      )  # 告知该数据包的振动数据提取和计算已完成

            if (filenameStr.endswith("FLUTTER-ANA001-512_new.txt")
                ):  # 如果文件以"FLUTTER-ANA001-512_new.txt"结尾
                print("FLUTTER-ANA001-512 Fetching Started!"
                      )  # 告知"FLUTTER-ANA001-512_new.txt"的数据读取开始

                columns_ANA001 = printColumns(filenameStr)  # 提取该数据包中的全部变量名称
                print("In total of " + str(len(columns_ANA001)) +
                      " columns")  # 告知一共有多少变量

                for j in range(1, len(columns_ANA001)):  # 搜索变量名称

                    print("Start " + str(j) + "/" +
                          str(len(columns_ANA001)))  # 告知已开始某变量的计算
                    jCol = readData(filenameStr,
                                    columns_ANA001[j])  # 读取该变量代表振动数据

                    corrJ = scs.pearsonr(
                        jCol, VIBtarget)[0]  # 计算该振动数据与目标振动数据间的皮尔逊相关系数
                    corList.append(corrJ)  # 将计算好的相关系数加入corList
                    colList.append(columns_ANA001[j])  # 将变量名称加入colList
                    print("Correlation between " + columns_ANA001[j] +
                          " and " + VIBname + " is " +
                          str(corrJ))  # 告知变量名称和相关性系数

                print("FLUTTER-ANA001-512 Fetching complete!"
                      )  # 告知该数据包的振动数据提取和计算已完成

            if (filenameStr.endswith("FLUTTER-ANA002-512_new.txt")
                ):  # 如果文件以"FLUTTER-ANA002-512_new.txt"结尾
                print("FLUTTER-ANA002-512 Fetching Started!"
                      )  # 告知"FLUTTER-ANA002-512_new.txt"的数据读取开始

                columns_ANA002 = printColumns(filenameStr)  # 提取该数据包中的全部变量名称
                print("In total of " + str(len(columns_ANA002)) +
                      " columns")  # 告知一共有多少变量

                for j in range(1, len(columns_ANA002)):  # 搜索变量名称

                    print("Start " + str(j) + "/" +
                          str(len(columns_ANA002)))  # 告知已开始某变量的计算
                    jCol = readData(filenameStr,
                                    columns_ANA002[j])  # 读取该变量代表振动数据

                    corrJ = scs.pearsonr(
                        jCol, VIBtarget)[0]  # 计算该振动数据与目标振动数据间的皮尔逊相关系数
                    corList.append(corrJ)  # 将计算好的相关系数加入corList
                    colList.append(columns_ANA002[j])  # 将变量名称加入colList
                    print("Correlation between " + columns_ANA002[j] +
                          " and " + VIBname + " is " +
                          str(corrJ))  # 告知变量名称和相关性系数

                print("FLUTTER-ANA002-512 Fetching complete!"
                      )  # 告知该数据包的振动数据提取和计算已完成

    return (corList, colList)  # 输出corList与colList
Пример #2
0
def predict():
    # vib_name表示需要预测的测点名称
    vib_Name = 'ANT6'
    # 飞参与vib的相关性及其变量名
    vib_191207_vib_corr = loadFile('Savedfile/' + vib_Name + '_vib_corr')
    vib_191207_vib_col = loadFile('Savedfile/' + vib_Name + '_vib_col')

    # list转换为np.array
    vib_191207_vib_corr_ary = np.array(vib_191207_vib_corr)
    vib_191207_vib_col_ary = np.array(vib_191207_vib_col)

    # 选择相关性最高的10个其他测点
    vib_highCol_vib = vib_191207_vib_col_ary[np.argsort(
        np.abs(vib_191207_vib_corr_ary))][-11:-1]

    # 读取相关的测点数据
    vib_191207 = vibMatFetch(vib_highCol_vib, "191207")
    vib_200102 = vibMatFetch(vib_highCol_vib, "200102")
    vib_200106 = vibMatFetch(vib_highCol_vib, "200106")

    # 读取需要预测的测点数据
    ANT6_191207 = np.array(
        readData([
            findFolder(vib_Name)[j] for j in range(3)
            if "191207" in findFolder(vib_Name)[j]
        ][0], vib_Name))
    ANT6_200102 = np.array(
        readData([
            findFolder(vib_Name)[j] for j in range(3)
            if "200102" in findFolder(vib_Name)[j]
        ][0], vib_Name))
    ANT6_200106 = np.array(
        readData([
            findFolder(vib_Name)[j] for j in range(3)
            if "200106" in findFolder(vib_Name)[j]
        ][0], vib_Name))
    # vib_191207_1, ANT6_191207_1 = TrainDataUnSamping(vib_191207, ANT6_191207, 10000)
    '''
    线性回归
    预测及结果展示
    '''
    LRreg = LinearRegression().fit(vib_191207, ANT6_191207)
    vib_pred_LR_200102 = LRreg.predict(vib_200102)
    print(
        abs(
            np.sqrt(np.mean(ANT6_200102**2)) -
            np.sqrt(np.mean(vib_pred_LR_200102**2))) /
        np.sqrt(np.mean(ANT6_200102**2)))
    plt.figure()
    plt.plot(ANT6_200102)
    plt.plot(vib_pred_LR_200102)
    plt.title('线性回归预测结果')
    '''
    支持向量机回归
    预测及结果展示
    '''
    SVRreg = make_pipeline(
        SVR(kernel='rbf',
            C=100,
            tol=0.1,
            gamma=0.1,
            epsilon=0.5,
            max_iter=1000))
    SVRreg.fit(vib_191207, ANT6_191207)
    vib_pred_SVR_200102 = SVRreg.predict(vib_200102)
    print(
        abs(
            np.sqrt(np.mean(ANT6_200102**2)) -
            np.sqrt(np.mean(vib_pred_SVR_200102**2))) /
        np.sqrt(np.mean(ANT6_200102**2)))
    plt.figure()
    plt.plot(ANT6_200102)
    plt.plot(vib_pred_SVR_200102)
    plt.title('支持向量回归预测结果')
    '''
    人工神经网络
    预测及结果展示
    '''
    ANNreg = make_pipeline(
        StandardScaler(),
        MLPRegressor(hidden_layer_sizes=(100, ),
                     alpha=0.001,
                     learning_rate_init=0.01,
                     random_state=1,
                     max_iter=10))
    ANNreg.fit(vib_191207, ANT6_191207)
    vib_pred_ANN_200102 = ANNreg.predict(vib_200102)
    print(
        abs(
            np.sqrt(np.mean(ANT6_200102**2)) -
            np.sqrt(np.mean(vib_pred_ANN_200102**2))) /
        np.sqrt(np.mean(ANT6_200102**2)))
    plt.figure()
    plt.plot(ANT6_200102)
    plt.plot(vib_pred_ANN_200102)
    plt.title('人工神经网络预测结果')
    '''
    算法集合体
    预测及结果展示
    '''
    vib_pred_ALL_200102 = np.hstack(
        (vib_pred_LR_200102.reshape(-1, 1), vib_pred_SVR_200102.reshape(-1, 1),
         vib_pred_ANN_200102.reshape(-1, 1)))
    # vib_pred_ALL_200102, ANT6_200102 = TrainDataUnSamping(vib_pred_ALL_200102, ANT6_200102, 10000)
    LR_meta = LinearRegression().fit(vib_pred_ALL_200102, ANT6_200102)

    vib_pred_LR_200106 = LRreg.predict(vib_200106)
    vib_pred_SVR_200106 = SVRreg.predict(vib_200106)
    vib_pred_ANN_200106 = ANNreg.predict(vib_200106)

    vib_pred_ALL_200106 = np.hstack(
        (vib_pred_LR_200106.reshape(-1, 1), vib_pred_SVR_200106.reshape(-1, 1),
         vib_pred_ANN_200106.reshape(-1, 1)))
    vib_pred_final_200106 = LR_meta.predict(vib_pred_ALL_200106)
    print(
        abs(
            np.sqrt(np.mean(ANT6_200106**2)) -
            np.sqrt(np.mean(vib_pred_final_200106**2))) /
        np.sqrt(np.mean(ANT6_200106**2)))
    plt.figure()
    plt.plot(ANT6_200106)
    plt.plot(vib_pred_final_200106)
    plt.title('算法集合体预测结果')
Пример #3
0
def FPCorrCalculator(vibName, flightTime):
    '''
    计算输入变量(vibName)与某个架次(flightTime)飞行参数的Pearson's Correlation
    返回2个变量corr_list, col_list
    corr_list: 相关性系数
    col_list: 与相关性系数对应的变量名
    (corr_list[i]为col_list[i]与vibName的Person's Correlation)
    返回值类型均为list
    '''

    vibFolder = \
        [findFolder(vibName)[i] for i in range(len(findFolder(vibName))) if flightTime in findFolder(vibName)[i]][
            0]  # 查找振动数据所在数据包名称
    vibTime = readTime(vibFolder)  # 读取数据包时间序列
    vibData = readData(vibFolder, vibName)  # 读取振动数据
    zeroCor_191207 = loadFile("Savedfile/zeroCor_191207"
                              )  # zeroCor_191207为191207架次中的衡量变量,与振动响应数据无任何相关性

    print("Vib Fetching complete!")  # 告知振动数据已经提取完毕

    corr_list = []  # 初始化相关性list
    col_list = []  # 初始化变量名list

    # fileList_ = printFiles++()
    # fileFT = [fileList_[i] for i in range(len(fileList_)) if flightTime in fileList_[i]]

    for i in range(7):  # 在全部数据包中搜索
        filenameList = printFiles(os.getcwd())  # 将全部数据包名称存入filenameList变量
        filenameStr = filenameList[i]  # 将搜索至数据包名称存至filenameStr变量

        if (filenameStr.endswith("CAOWEN-664002-32.txt")
                or filenameStr.endswith("CAOWEN-664003-32.txt")
                or filenameStr.endswith("CAOWEN-ANA003-32.txt")
                or filenameStr.endswith("FCS-664002-16.txt")):  # 筛选飞参数据包
            print(filenameStr + " Fetching Started!")  # 告知开始提取某飞参数据包的数据
            # print (filenameStr)
            time_i = readTime(filenameStr)  # 将该飞参数据的时间数据存至time_i变量
            columns_i = printColumns(filenameStr)  # 将该飞参数据的变量名称存至columns_i变量
            print("In total of " + str(len(columns_i)) +
                  " columns")  # 告知一共有多少变量

            for j in range(1, len(columns_i)):  # 搜索提取的变量名称

                print("Start " + str(j) + "/" +
                      str(len(columns_i)))  # 告知开始计算某个变量

                if (columns_i[j] in zeroCor_191207):  # 如果某个变量在zeroCor_191207中
                    print(columns_i[j] + " Break!")  # 告知并跳过该变量的计算

                elif ("Accel"
                      in columns_i[j]):  # 如果某个变量包括"Accel"在变量名称中,该变量为加速度传感器数据
                    print(columns_i[j] + " Break!")  # 告知并跳过该变量的计算

                else:  # 如果不符合以上两种情况
                    jCol = readData(filenameStr, columns_i[j])  # 读取飞参数据
                    jCol_matched = matchData(vibTime, time_i,
                                             jCol)  # 将飞参数据与振动数据时间轴匹配
                    corrJ = scs.pearsonr(jCol_matched,
                                         vibData)[0]  # 计算该飞参数据与振动响应数据的相关性
                    corr_list.append(corrJ)  # 将计算的相关性加入corr_list中
                    col_list.append(columns_i[j])  # 将变量名称加入col_list
                    print("Correlation between " + columns_i[j] + " and " +
                          str(vibName) + " is " + str(corrJ))  # 告知变量名与相关性

            print(filenameStr + " Fetching complete!")  # 告知飞参变量的读取完毕

    return (corr_list, col_list)  # 输出corr_list与col_list
Пример #4
0
def predict():
    # vib_name表示需要预测的测点名称
    vib_Name = 'ANT4'
    # 垂直尾翼测点名称
    VT_vib_names = ["ANT1", "ANT2", "ANT3", "ANT4", "ANT5", "ANT6", "ANT7"]
    # 垂直尾翼数据读取
    VT_vib_data = []
    for i in range(len(VT_vib_names)):
        VT_vib_data.append(
            readData(findFolder(VT_vib_names[i])[0], VT_vib_names[i]))
        print(VT_vib_names[i] + " Finished!")

    VT_vib_ary = np.array(VT_vib_data).T

    # 提取需要预测测点的监测序列
    ANT4_191207 = np.array(VT_vib_data[3])

    # 垂直尾翼模态叠加法训练及预测
    # 垂直尾翼固有模态
    VTZMode_phi1 = 14.368 * np.array([
        0.112540, 0.028934, 0.131050, 0.037767, 0.043148, 0.094470, 0.134830
    ]).reshape(-1, 1)
    VTZMode_phi2 = 45.686 * np.array([
        0.000378, 0.092578, 0.136430, 0.038831, 0.015865, 0.035344, 0.163180
    ]).reshape(-1, 1)
    VTZMode_phi3 = 56.507 * np.array([
        0.102730, 0.038422, 0.116900, 0.039560, 0.047495, 0.090431, 0.120570
    ]).reshape(-1, 1)
    VTZMode_phi4 = 61.685 * np.array([
        0.126060, 0.032371, 0.089103, 0.044842, 0.085259, 0.116170, 0.072661
    ]).reshape(-1, 1)
    VTZMode_mat = np.concatenate(
        (VTZMode_phi1, VTZMode_phi2, VTZMode_phi3, VTZMode_phi4), axis=1)

    ANT4_191207_pred_MT = []
    X_i = np.vstack((VTZMode_mat[:3, :], VTZMode_mat[4:, :]))
    for i in range(len(ANT4_191207)):
        y_i = np.concatenate((VT_vib_ary[i, :3], VT_vib_ary[i, 4:]))
        reg = LinearRegression(fit_intercept=True).fit(X_i, y_i)
        # ANT4_191207_pred_MT.append(np.dot(reg.coef_, VTZMode_mat[3, :]))
        ANT4_191207_pred_MT.append(
            reg.predict(VTZMode_mat[3, :].reshape(1, -1))[0])
        if (i % 400000 == 0):
            print(str(round(i / len(ANT4_191207) * 100, 2)) + "%")

    ANT4_191207_pred_MT = np.array(ANT4_191207_pred_MT)
    print(
        abs(
            np.sqrt(np.mean(ANT4_191207**2)) -
            np.sqrt(np.mean(ANT4_191207_pred_MT**2))) /
        np.sqrt(np.mean(ANT4_191207**2)))
    plt.figure()
    plt.plot(ANT4_191207)
    plt.plot(ANT4_191207_pred_MT)
    plt.title('垂直尾翼模态叠加法预测结果')

    # 最高次项为2的平面插值方法
    # 垂直尾翼测点坐标(2维)
    VT_vib_pos = np.array([[3.2, 3.7], [2, 2.2], [3.85, 3.7], [3.1, 2],
                           [3.55, 2], [3.1, 3.4], [4.2, 3.7]])

    ANT4_191207_pred_CZ = []
    X_i = np.vstack((VT_vib_pos[:3, :], VT_vib_pos[4:, :]))
    X_i_dg2 = np.hstack((X_i, X_i**2))
    for i in range(len(ANT4_191207)):
        y_i = np.concatenate((VT_vib_ary[i, :3], VT_vib_ary[i, 4:]))
        lr = LinearRegression().fit(X_i_dg2, y_i)
        ANT4_191207_pred_CZ.append(
            lr.predict(
                np.hstack(
                    (VT_vib_pos[3, :], VT_vib_pos[3, :]**2)).reshape(1,
                                                                     -1))[0])
        if (i % 400000 == 0):
            print(str(round(i / len(ANT4_191207) * 100, 2)) + "%")

    ANT4_191207_pred_CZ = np.array(ANT4_191207_pred_CZ)
    print(
        abs(
            np.sqrt(np.mean(ANT4_191207**2)) -
            np.sqrt(np.mean(ANT4_191207_pred_CZ**2))) /
        np.sqrt(np.mean(ANT4_191207**2)))
    plt.figure()
    plt.plot(ANT4_191207_pred_CZ)
    plt.plot(ANT4_191207)
    plt.title('垂直尾翼平面插值法预测结果')
    '''
    算法集合体
    预测及结果展示
    '''
    ANT4_pred_ALL_191207 = np.hstack(
        (ANT4_191207_pred_MT.reshape(-1,
                                     1), ANT4_191207_pred_CZ.reshape(-1, 1)))
    # LR_meta = LinearRegression().fit(ANT4_pred_ALL_191207, ANT4_191207)
    LR_meta = ensembleTrain(ANT4_pred_ALL_191207, ANT4_191207, step=5000)
    ANT4_pred_final_191207 = LR_meta.predict(ANT4_pred_ALL_191207)
    print(
        abs(
            np.sqrt(np.mean(ANT4_191207**2)) -
            np.sqrt(np.mean(ANT4_pred_final_191207**2))) /
        np.sqrt(np.mean(ANT4_191207**2)))
    plt.figure()
    plt.plot(ANT4_191207)
    plt.plot(ANT4_pred_final_191207)
    plt.title('垂直尾翼算法集合体预测结果')
Пример #5
0
def predict():
    # vib_name表示需要预测的测点名称
    vib_Name = 'ANH4'
    # 水平尾翼测点名称
    LT_vib_names = ["ANH1", "ANH2", "ANH3", "ANH4", "ANH5", "ANH11", "ANH13"]
    # 水平尾翼数据读取
    LT_vib_data = []
    for i in range(len(LT_vib_names)):
        LT_vib_data.append(
            readData(findFolder(LT_vib_names[i])[0], LT_vib_names[i]))
        print(LT_vib_names[i] + " Finished!")

    LT_vib_ary = np.array(LT_vib_data).T

    # 提取需要预测测点的监测序列
    ANH4_191207 = np.array(LT_vib_data[3])

    # 水平尾翼模态叠加法训练及预测
    # 水平尾翼固有模态
    LTZMode_phi1 = 17.960 * np.array([
        0.198240, 0.209660, 0.060092, 0.079628, 0.007122, 0.172180, 0.096400
    ]).reshape(-1, 1)
    LTZMode_phi2 = 51.337 * np.array([
        0.186680, 0.196690, 0.069147, 0.079404, 0.014269, 0.164790, 0.101410
    ]).reshape(-1, 1)
    LTZMode_phi3 = 64.446 * np.array([
        0.136150, 0.219270, 0.150160, 0.072657, 0.013771, 0.065595, 0.033473
    ]).reshape(-1, 1)
    LTZMode_phi4 = 80.292 * np.array([
        0.170690, 0.083437, 0.087226, 0.093101, 0.042739, 0.156430, 0.179670
    ]).reshape(-1, 1)
    LTZMode_mat = np.concatenate(
        (LTZMode_phi1, LTZMode_phi2, LTZMode_phi3, LTZMode_phi4), axis=1)

    ANH4_191207_pred_MT = []
    X_i = np.vstack((LTZMode_mat[:3, :], LTZMode_mat[4:, :]))
    for i in range(len(ANH4_191207)):
        y_i = np.concatenate((LT_vib_ary[i, :3], LT_vib_ary[i, 4:]))
        reg = LinearRegression(fit_intercept=True).fit(X_i, y_i)
        # ANH4_191207_pred_MT.append(np.dot(reg.coef_, LTZMode_mat[3, :]))
        ANH4_191207_pred_MT.append(
            reg.predict(LTZMode_mat[3, :].reshape(1, -1))[0])
        if (i % 400000 == 0):
            print(str(round(i / len(ANH4_191207) * 100, 2)) + "%")

    ANH4_191207_pred_MT = np.array(ANH4_191207_pred_MT)
    print(
        abs(
            np.sqrt(np.mean(ANH4_191207**2)) -
            np.sqrt(np.mean(0.04 * ANH4_191207_pred_MT**2))) /
        np.sqrt(np.mean(ANH4_191207**2)))
    plt.figure()
    plt.plot(ANH4_191207)
    plt.plot(0.2 * ANH4_191207_pred_MT)
    plt.title('0.2*水平尾翼模态叠加法预测结果')

    # 最高次项为2的平面插值方法
    # 水平尾翼测点坐标(2维)
    LT_vib_pos = np.array([[-0.15, 3.5], [-0.45, 3.5], [0.75, 2.3],
                           [0.05, 2.3], [0, 0.9], [0, 3.3], [-0.3, 2.4]])

    ANH4_191207_pred_CZ = []
    X_i = np.vstack((LT_vib_pos[:3, :], LT_vib_pos[4:, :]))
    X_i_dg2 = np.hstack((X_i, X_i**2))
    for i in range(len(ANH4_191207)):
        y_i = np.concatenate((LT_vib_ary[i, :3], LT_vib_ary[i, 4:]))
        lr = LinearRegression().fit(X_i_dg2, y_i)
        ANH4_191207_pred_CZ.append(
            lr.predict(
                np.hstack(
                    (LT_vib_pos[3, :], LT_vib_pos[3, :]**2)).reshape(1,
                                                                     -1))[0])
        if (i % 400000 == 0):
            print(str(round(i / len(ANH4_191207) * 100, 2)) + "%")

    ANH4_191207_pred_CZ = np.array(ANH4_191207_pred_CZ)
    print(
        abs(
            np.sqrt(np.mean(ANH4_191207**2)) -
            np.sqrt(np.mean(ANH4_191207_pred_CZ**2))) /
        np.sqrt(np.mean(ANH4_191207**2)))
    plt.figure()
    plt.plot(ANH4_191207_pred_CZ)
    plt.plot(ANH4_191207)
    plt.title('水平尾翼平面插值法预测结果')
    '''
    算法集合体
    预测及结果展示
    '''
    ANH4_pred_ALL_191207 = np.hstack(
        (ANH4_191207_pred_MT.reshape(-1,
                                     1), ANH4_191207_pred_CZ.reshape(-1, 1)))
    # LR_meta = LinearRegression().fit(ANH4_pred_ALL_191207, ANH4_191207)
    LR_meta = ensembleTrain(ANH4_pred_ALL_191207,
                            ANH4_191207,
                            step=len(ANH4_191207))
    ANH4_pred_final_191207 = LR_meta.predict(ANH4_pred_ALL_191207)
    print(
        abs(
            np.sqrt(np.mean(ANH4_191207**2)) -
            np.sqrt(np.mean(ANH4_pred_final_191207**2))) /
        np.sqrt(np.mean(ANH4_191207**2)))
    plt.figure()
    plt.plot(ANH4_191207)
    plt.plot(ANH4_pred_final_191207)
    plt.title('水平尾翼算法集合体预测结果')
Пример #6
0
def predict():
    # vib_name表示需要预测的测点名称
    vib_Name = 'ANW5'
    # 机翼测点名称
    wing_vib_names = [
        "ANW1", "ANW2", "ANW3", "ANW4", "ANW5", "ANW6", "ANW7", "ANW8",
        "ANW17", "ANW18"
    ]
    # 机翼数据读取
    wing_vib_data = []
    for i in range(len(wing_vib_names)):
        wing_vib_data.append(
            readData(findFolder(wing_vib_names[i])[0], wing_vib_names[i]))
        print(wing_vib_names[i] + " Finished!")

    wing_vib_ary = np.array(wing_vib_data).T

    # 提取需要预测测点的监测序列
    ANW5_191207 = np.array(wing_vib_data[4])

    # 机翼模态叠加法训练及预测
    # 机翼固有模态
    wingZMode_phi1 = 4.6242 * np.array([
        0.053323, 0.054902, 0.052748, 0.039911, 0.040730, 0.019372, 0.020486,
        0.048519, 0.002433, 0.018903
    ]).reshape(-1, 1)
    wingZMode_phi2 = 10.135 * np.array([
        0.057075, 0.059566, 0.056369, 0.039238, 0.040464, 0.015998, 0.016806,
        0.050925, 0.002292, 0.016526
    ]).reshape(-1, 1)
    wingZMode_phi3 = 20.535 * np.array([
        0.044158, 0.053486, 0.040799, 0.013048, 0.014958, 0.032946, 0.029549,
        0.034825, 0.008309, 0.026757
    ]).reshape(-1, 1)
    wingZMode_phi4 = 33.196 * np.array([
        0.041207, 0.052499, 0.039350, 0.007710, 0.010925, 0.031769, 0.032244,
        0.028927, 0.008433, 0.031172
    ]).reshape(-1, 1)
    wingZMode_mat = np.concatenate(
        (wingZMode_phi1, wingZMode_phi2, wingZMode_phi3, wingZMode_phi4),
        axis=1)

    ANW5_191207_pred_MT = []
    X_i = np.vstack((wingZMode_mat[:4, :], wingZMode_mat[5:-2, :]))
    for i in range(len(ANW5_191207)):
        y_i = np.concatenate((wing_vib_ary[i, :4], wing_vib_ary[i, 5:-2]))
        reg = LinearRegression(fit_intercept=True).fit(X_i, y_i)
        # ANW5_191207_pred_MT.append(np.dot(reg.coef_, wingZMode_mat[4, :]))
        ANW5_191207_pred_MT.append(
            reg.predict(wingZMode_mat[4, :].reshape(1, -1))[0])
        if (i % 400000 == 0):
            print(str(round(i / len(ANW5_191207) * 100, 2)) + "%")

    ANW5_191207_pred_MT = np.array(ANW5_191207_pred_MT)
    print(
        abs(
            np.sqrt(np.mean(ANW5_191207**2)) -
            np.sqrt(np.mean(ANW5_191207_pred_MT**2))) /
        np.sqrt(np.mean(ANW5_191207**2)))
    plt.figure()
    plt.plot(ANW5_191207)
    plt.plot(ANW5_191207_pred_MT)
    plt.title('机翼模态叠加法预测结果')

    # 最高次项为2的平面插值方法
    # 机翼测点坐标(2维)
    wing_vib_pos = np.array([[-0.9, 8.3], [-1.45, 8.3], [-0.7, 8.3],
                             [-0.5, 6.9], [-0.8, 6.9], [0.7, 4.7], [0.2, 4.7],
                             [-1.4, 7.35], [0.15, 1.3], [-0.45, 4.3]])

    ANW5_191207_pred_CZ = []
    X_i = np.vstack((wing_vib_pos[:4, :], wing_vib_pos[5:-2, :]))
    X_i_dg2 = np.hstack((X_i, X_i**2))
    for i in range(len(ANW5_191207)):
        y_i = np.concatenate((wing_vib_ary[i, :4], wing_vib_ary[i, 5:-2]))
        lr = LinearRegression().fit(X_i_dg2, y_i)
        ANW5_191207_pred_CZ.append(
            lr.predict(
                np.hstack((wing_vib_pos[4, :],
                           wing_vib_pos[4, :]**2)).reshape(1, -1))[0])
        if (i % 400000 == 0):
            print(str(round(i / len(ANW5_191207) * 100, 2)) + "%")

    ANW5_191207_pred_CZ = np.array(ANW5_191207_pred_CZ)
    print(
        abs(
            np.sqrt(np.mean(ANW5_191207**2)) -
            np.sqrt(np.mean(ANW5_191207_pred_CZ**2))) /
        np.sqrt(np.mean(ANW5_191207**2)))
    plt.figure()
    plt.plot(ANW5_191207_pred_CZ)
    plt.plot(ANW5_191207)
    plt.title('机翼平面插值法预测结果')
    '''
    算法集合体
    预测及结果展示
    '''
    ANW5_pred_ALL_191207 = np.hstack(
        (ANW5_191207_pred_MT.reshape(-1,
                                     1), ANW5_191207_pred_CZ.reshape(-1, 1)))
    # LR_meta = LinearRegression().fit(ANW5_pred_ALL_191207, ANW5_191207)
    LR_meta = ensembleTrain(ANW5_pred_ALL_191207, ANW5_191207, step=5000)
    ANW5_pred_final_191207 = LR_meta.predict(ANW5_pred_ALL_191207)
    print(
        abs(
            np.sqrt(np.mean(ANW5_191207**2)) -
            np.sqrt(np.mean(ANW5_pred_final_191207**2))) /
        np.sqrt(np.mean(ANW5_191207**2)))
    plt.figure()
    plt.plot(ANW5_191207)
    plt.plot(ANW5_pred_final_191207)
    plt.title('机翼算法集合体预测结果')