├── FeedForwardNeuralNetwork ├── IEEE118 │ ├── 01.py │ ├── IEEE118.py │ ├── Readme │ ├── cyclic_lr_scheduler.py │ ├── dnn-test.xls │ ├── ffnn.xls │ ├── final_params.pkl │ ├── initial_batch_params.pkl │ └── integratedata.py ├── IEEE14 │ ├── 01.py │ ├── IEEE14.py │ ├── Readme │ ├── cyclic_lr_scheduler.py │ ├── dnn-test.xls │ ├── ffnn.xls │ ├── final_params.pkl │ ├── initial_batch_params.pkl │ ├── integratedata.py │ └── measurements.xlsx └── ReadMe ├── LSTM ├── IEEE118 │ ├── IEEE118.py │ ├── Readme │ ├── cyclic_lr_scheduler.py │ ├── final_params.pkl │ ├── initial_batch_params.pkl │ └── integratedata.py ├── IEEE14 │ ├── 01.py │ ├── IEEE14.py │ ├── ReadMe │ ├── cyclic_lr_scheduler.py │ ├── final_params.pkl │ ├── hidden.xls │ ├── hiddentrain.xls │ ├── initial_batch_params.pkl │ ├── integratedata.py │ └── measurements.xlsx └── ReadMe ├── README.md ├── WLAV ├── IEEE14WLAV.m └── ReadMe ├── WLS ├── IEEE118 │ ├── GenerateData.m │ ├── GenerateDataTest.m │ └── wls.m ├── IEEE14 │ ├── GenerateData.m │ ├── GenerateDataTest.m │ ├── measurements.xlsx │ └── wls.m └── ReadMe ├── loadprofile-test.xls └── loadprofile-train.xls /FeedForwardNeuralNetwork/IEEE118/01.py: -------------------------------------------------------------------------------- 1 | # import matplotlib.pyplot as plt 2 | # import xlrd 3 | # import numpy as np 4 | # import pandas as pd 5 | # from numpy import linalg as LA 6 | # import xlwt 7 | # 8 | # # data_sheet = xlrd.open_workbook('result.xls') 9 | # # dataset = data_sheet.sheets()[0] 10 | # 11 | # 12 | # 13 | # real = pd.read_excel('./Results/real.xlsx', sheetname='Sheet1', header=None) 14 | # real = real.as_matrix() 15 | # real_angle = real[-288:, 0:13] # 7000:8000 16 | # real_voltage = real[-288:, 13:] 17 | # 18 | # h_real_voltage = [] 19 | # for i in range(24): 20 | # tmp = np.sum(h_real_voltage[i * 5:(i + 1) * 5 - 1]) 21 | # h_real_voltage.append(1/12*tmp) 22 | # h_real_voltage = np.array(h_real_voltage) 23 | # h_real_voltage = h_real_voltage.squeeze() 24 | # 25 | # dnn = pd.read_excel('./Results/dnn-test-total.xls', sheetname='Sheet1', header=None) 26 | # dnn = dnn.as_matrix() 27 | # # sys_data = sys_data.T 28 | # dnn_angle = dnn[:, 0:13] 29 | # dnn_voltage = dnn[:, 13:] 30 | # 31 | # wls = pd.read_excel('./Results/wls.xlsx', sheetname='Sheet1', header=None) 32 | # wls = wls.as_matrix() 33 | # wls_angle = wls[-288:, 0:13] 34 | # wls_voltage = wls[-288:, 13:] 35 | # 36 | # 37 | # 38 | # wls_real_angle = (wls_angle - real_angle) ** 2 39 | # wls_real_voltage = (wls_voltage - real_voltage) ** 2 40 | # 41 | # dnn_real_angle = (dnn_angle - real_angle) ** 2 42 | # dnn_real_voltage = (dnn_voltage - real_voltage) ** 2 43 | # norm2_DNN_VA = 1 / dnn_real_angle.shape[1] * np.sqrt(np.sum(dnn_real_angle, axis=1)) 44 | # norm2_WLS_VA = 1 / wls_real_angle.shape[1] * np.sqrt(np.sum(wls_real_angle, axis=1)) 45 | # norm2_DNN_VM = 1 / dnn_real_voltage.shape[1] * np.sqrt(np.sum(dnn_real_voltage, axis=1)) 46 | # norm2_WLS_VM = 1 / wls_real_voltage.shape[1] * np.sqrt(np.sum(wls_real_voltage, axis=1)) 47 | # 48 | # 49 | # h_norm2_DNN_VA = [] 50 | # for i in range(24): 51 | # tmp = np.sum(norm2_DNN_VA[i * 5:(i + 1) * 5 - 1]) 52 | # h_norm2_DNN_VA.append(1/12*tmp) 53 | # h_norm2_DNN_VA = np.array(h_norm2_DNN_VA) 54 | # h_norm2_DNN_VA = h_norm2_DNN_VA.squeeze() 55 | # 56 | # h_norm2_WLS_VA = [] 57 | # for i in range(24): 58 | # tmp = np.sum(norm2_WLS_VA[i * 12:(i + 1) * 12]) 59 | # h_norm2_WLS_VA.append(1/12*tmp) 60 | # h_norm2_WLS_VA = np.array(h_norm2_WLS_VA) 61 | # h_norm2_WLS_VA = h_norm2_WLS_VA.squeeze() 62 | # 63 | # h_norm2_DNN_VM = [] 64 | # for i in range(24): 65 | # tmp = np.sum(norm2_DNN_VM[i * 12:(i + 1) * 12 ]) 66 | # h_norm2_DNN_VM.append(1/12*tmp) 67 | # h_norm2_DNN_VM = np.array(h_norm2_DNN_VM) 68 | # h_norm2_DNN_VM = h_norm2_DNN_VM.squeeze() 69 | # 70 | # h_norm2_WLS_VM = [] 71 | # for i in range(24): 72 | # tmp = np.sum(norm2_WLS_VM[i * 12:(i + 1) * 12]) 73 | # h_norm2_WLS_VM.append(1/12*tmp) 74 | # h_norm2_WLS_VM = np.array(h_norm2_WLS_VM) 75 | # h_norm2_WLS_VM = h_norm2_WLS_VM.squeeze() 76 | # 77 | # ''' 78 | # norm2_DNN_VA, norm2_WLS_VA, norm2_DNN_VM, norm2_WLS_VM = [], [], [], [] 79 | # for i in range(100): 80 | # 81 | # norm2_DNN_VA.append(LA.norm(dnn_angle - real_angle)) 82 | # norm2_WLS_VA.append(LA.norm(wls_angle - real_angle)) 83 | # norm2_DNN_VM.append(LA.norm(dnn_voltage - real_voltage)) 84 | # norm2_WLS_VM.append(LA.norm(wls_voltage - real_voltage)) 85 | # 86 | # print('norm2_DNN_VA: ', LA.norm(dnn_angle - real_angle)) 87 | # print('norm2_WLS_VA: ', LA.norm(wls_angle - real_angle)) 88 | # 89 | # print('norm2_DNN_VM: ', LA.norm(dnn_voltage - real_voltage)) 90 | # print('norm2_WLS_VM: ', LA.norm(wls_voltage - real_voltage)) 91 | # print(50 * '*') 92 | # 93 | # file = xlwt.Workbook() 94 | # sheet = file.add_sheet('sheet1', cell_overwrite_ok=True) 95 | # for i in range(100): 96 | # # print(type(measurement)) 97 | # sheet.write(i, 0, norm2_DNN_VA[i]) 98 | # sheet.write(i, 1, norm2_WLS_VA[i]) 99 | # sheet.write(i, 2, norm2_DNN_VM[i]) 100 | # sheet.write(i, 3, norm2_WLS_VM[i]) 101 | # file.save('Euclidean.xls') 102 | # ''' 103 | # 104 | # ''' 105 | # # 设置图例并且设置图例的字体及大小 106 | # font1 = {'family': 'Times New Roman', 107 | # 'weight': 'normal', 108 | # 'size': 12, 109 | # } 110 | # 111 | # # 设置坐标刻度值的大小以及刻度值的字体 112 | # # plt.tick_params(labelsize=15) 113 | # 114 | # font2 = {'family' : 'Times New Roman', 115 | # 'weight' : 'normal', 116 | # 'size' : 14, 117 | # } 118 | # 119 | # angle_axis = np.arange(1, 14, 1) 120 | # print('angle') 121 | # p1.plot(angle_axis, dnn_angle, 'x-', color='red', label='DNN', linewidth=1.0) 122 | # p1.plot(angle_axis, wls_angle, '*-', color='green', label='WLS', linewidth=1.0) 123 | # p1.plot(angle_axis, real_angle, '.-', color='blue', label='Real', linestyle='--') 124 | # p1.set_xlabel('Bus Number', font2) 125 | # p1.set_ylabel('Voltage Angle(degree)', font2) 126 | # p1.set_xticks(angle_axis) 127 | # p1.grid(axis='y') 128 | # p1.legend() 129 | # # 130 | # magnitude_axis = np.arange(1, 15, 1) 131 | # print('magnitude') 132 | # p2.plot(magnitude_axis, dnn_voltage, 'x-', color='red', label='DNN', linewidth=1.0) 133 | # p2.plot(magnitude_axis, wls_voltage, '*-', color='green', label='WLS', linewidth=1.0) 134 | # p2.plot(magnitude_axis, real_voltage, '.-', color='blue', label='Real', linestyle='--') 135 | # p2.set_xlabel('Bus Number', font2) 136 | # p2.set_ylabel('Voltage Magnitude(pu)', font2) 137 | # p2.set_xticks(magnitude_axis) 138 | # p2.grid(axis='y') 139 | # p2.legend() 140 | # 141 | # # legend = plt.legend(prop=font1) 142 | # # plt.xticks(x_axis) 143 | # # plt.grid(axis='y') 144 | # plt.show() 145 | # 146 | # exit() 147 | # ''' 148 | # # plt.tick_params(labelsize=15) 149 | # 150 | # font2 = {'family' : 'Times New Roman', 151 | # 'weight' : 'normal', 152 | # 'size' : 14, 153 | # } 154 | # 155 | # 156 | # # ''' 157 | # plt.figure() 158 | # p1 = plt.subplot() 159 | # # p2 = plt.subplot(122) 160 | # width = 0.3 161 | # ind = np.arange(len(h_norm2_DNN_VA)) 162 | # # fig, ax = plt.subplots() 163 | # rects1 = p1.bar(ind, h_norm2_DNN_VA, width, color='r') 164 | # rects2 = p1.bar(ind + width, h_norm2_WLS_VA, width, color='b') 165 | # 166 | # print('*****************DNN**************') 167 | # print('5min',norm2_DNN_VA[0]) 168 | # print('1h',np.sum(norm2_DNN_VA[0:12])/12) 169 | # print('one day',np.sum(norm2_DNN_VA) / len(norm2_DNN_VA)) 170 | # print('*****************WLS**************') 171 | # print('5min',norm2_WLS_VA[0]) 172 | # print('1h',np.sum(norm2_WLS_VA[0:12])/12) 173 | # print('one day',np.sum(norm2_WLS_VA) / len(norm2_WLS_VA)) 174 | # # add some text for labels, title and axes ticks 175 | # p1.set_ylabel('RMSE', font2) 176 | # p1.set_title('IEEE14 voltage angles', font2) 177 | # # ax.set_xticks(ind + width / 2) 178 | # 179 | # 180 | # # ind = np.arange(len(h_norm2_DNN_VM)) 181 | # # rects3 = p2.bar(ind, h_norm2_DNN_VM, width, color='r') 182 | # # rects4 = p2.bar(ind + width, h_norm2_WLS_VM, width, color='b') 183 | # # print('*****************DNN**************') 184 | # # print('5min',norm2_DNN_VM[0]) 185 | # # print('1h',np.sum(norm2_DNN_VM[0:12])/12) 186 | # # print('one day',np.sum(norm2_DNN_VM) / len(norm2_DNN_VM)) 187 | # # 188 | # # print('*****************WLS**************') 189 | # # print('5min',norm2_WLS_VM[0]) 190 | # # print('1h',np.sum(norm2_WLS_VM[0:12])/12) 191 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 192 | # # 193 | # # # add some text for labels, title and axes ticks 194 | # # p2.set_ylabel('RMSE', font2) 195 | # # p2.set_title('IEEE14 voltage magnitudes', font2) 196 | # # # ax.set_xticks(ind + width / 2) 197 | # 198 | # 199 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 200 | # # p2.legend((rects3[0], rects4[0]), ('DNN', 'WLS')) 201 | # plt.show() 202 | # ''' 203 | # 204 | # #plot msr_rmse 205 | # width = 0.5 206 | # plt.figure() 207 | # p1 = plt.subplot() 208 | # wls_msr_rmse = pd.read_excel('./Results/msr_rmse.xlsx', sheetname='rmse', header=None) 209 | # wls_msr_rmse = wls_msr_rmse [584:] 210 | # h_wls_msr_rmse = [] 211 | # for i in range(24): 212 | # tmp = np.sum(wls_msr_rmse[i * 5:(i + 1) * 5 - 1]) 213 | # h_wls_msr_rmse.append(1/12*tmp) 214 | # h_wls_msr_rmse = np.array(h_wls_msr_rmse) 215 | # h_wls_msr_rmse = h_wls_msr_rmse.squeeze() 216 | # # wls_msr_rmse = wls_msr_rmse.as_matrix() 217 | # print('*****************WLS**************') 218 | # # print('5min',wls_msr_rmse[0]) 219 | # # print('1h',np.sum(wls_msr_rmse[0:12])/12) 220 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 221 | # 222 | # # p1.plot(wls_msr_rmse) 223 | # 224 | # 225 | # 226 | # dnn_msr_mse = pd.read_excel('./Results/dnn.xls', sheetname='loss', header=None) 227 | # # dnn_msr_mse = dnn_msr_mse.as_matrix() 228 | # dnn_msr_rmse = np.sqrt(dnn_msr_mse) 229 | # dnn_msr_rmse = dnn_msr_rmse[584:] 230 | # 231 | # h_dnn_msr_rmse = [] 232 | # for j in range(24): 233 | # tmp = np.sum(dnn_msr_rmse[ j*5:((j + 1)*5 - 1)]) 234 | # h_dnn_msr_rmse.append(1/12*tmp) 235 | # h_dnn_msr_rmse = np.array(h_dnn_msr_rmse) 236 | # h_dnn_msr_rmse = h_dnn_msr_rmse.squeeze() 237 | # print('*****************DNN**************') 238 | # # print('5min',norm2_WLS_VM[0]) 239 | # # print('1h',np.sum(norm2_WLS_VM[0:12])/12) 240 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 241 | # 242 | # 243 | # ind = np.arange(len(h_dnn_msr_rmse)) 244 | # rects1 = p1.bar(ind, h_dnn_msr_rmse, width, color='r') 245 | # rects2 = p1.bar(ind + width, h_wls_msr_rmse, width, color='b') 246 | # p1.set_ylabel('RMSE', font2) 247 | # p1.set_title('Measurement RMSE in IEEE14', font2) 248 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 249 | # # plt.plot(ind, dnn_msr_rmse, ind, wls_msr_rmse) 250 | # 251 | # plt.show() 252 | # 253 | # ''' 254 | 255 | 256 | import pandas as pd 257 | import matplotlib.pyplot as plt 258 | import numpy as np 259 | from numpy import linalg as LA 260 | from matplotlib.patches import ConnectionPatch 261 | import xlwt 262 | 263 | # # 设置图例并且设置图例的字体及大小 264 | font1 = {'family': 'Times New Roman', 265 | 'weight': 'normal', 266 | 'size': 18, 267 | } 268 | 269 | font2 = {'family': 'Times New Roman', 270 | 'weight': 'normal', 271 | 'size': 20, 272 | } 273 | 274 | wls = pd.read_excel('./Results/wls.xlsx', sheetname='Sheet1', header=None) 275 | wls = wls.as_matrix() 276 | mask = np.where(np.isnan(wls[:, 0]))[0] 277 | wls = np.delete(wls, mask, axis=0) 278 | 279 | 280 | wls_angle = wls[:, 0:13] 281 | wls_voltage = wls[:, 13:] 282 | 283 | dnn = pd.read_excel('./Results/dnn-test-total.xls', sheetname='Sheet1', header=None) 284 | dnn = dnn.as_matrix() 285 | dnn = np.delete(dnn, mask, axis=0) 286 | 287 | 288 | # sys_data = sys_data.T 289 | dnn_angle = dnn[:, 0:13] 290 | dnn_voltage = dnn[:, 13:] 291 | 292 | real = pd.read_excel('./Results/real.xlsx', sheetname='Sheet1', header=None) 293 | real = real.as_matrix() 294 | real = np.delete(real, mask, axis=0) 295 | 296 | real_angle = real[:, 0:13] 297 | real_voltage = real[:, 13:] 298 | 299 | wls_real_angle = (wls_angle - real_angle) ** 2 300 | wls_real_voltage = (wls_voltage - real_voltage) ** 2 301 | 302 | dnn_real_angle = (dnn_angle - real_angle) ** 2 303 | dnn_real_voltage = (dnn_voltage - real_voltage) ** 2 304 | norm2_DNN_VA = 1 / dnn_real_angle.shape[1] * np.sqrt(np.sum(dnn_real_angle, axis=1)) 305 | norm2_WLS_VA = 1 / wls_real_angle.shape[1] * np.sqrt(np.sum(wls_real_angle, axis=1)) 306 | mask1 = np.where(norm2_WLS_VA > 0.05) 307 | norm2_DNN_VM = 1 / dnn_real_voltage.shape[1] * np.sqrt(np.sum(dnn_real_voltage, axis=1)) 308 | norm2_WLS_VM = 1 / wls_real_voltage.shape[1] * np.sqrt(np.sum(wls_real_voltage, axis=1)) 309 | mask2 = np.where(norm2_WLS_VM > 0.02) 310 | mask3 = np.hstack((mask1, mask2)) 311 | mask3 = np.unique(mask3) 312 | 313 | norm2_DNN_VA = np.delete(norm2_DNN_VA, mask3, axis=0) 314 | norm2_WLS_VA = np.delete(norm2_WLS_VA, mask3, axis=0) 315 | norm2_DNN_VM = np.delete(norm2_DNN_VM, mask3, axis=0) 316 | norm2_WLS_VM = np.delete(norm2_WLS_VM, mask3, axis=0) 317 | 318 | norm2_DNN_VA = norm2_DNN_VA[-288:] 319 | norm2_WLS_VA = norm2_WLS_VA[-288:] 320 | norm2_DNN_VM = norm2_DNN_VM[-288:] 321 | norm2_WLS_VM = norm2_WLS_VM[-288:] 322 | 323 | 324 | print(len(norm2_DNN_VA)) 325 | 326 | h_norm2_DNN_VA = [] 327 | for i in range(len(norm2_DNN_VA)): 328 | if (i + 1) % 12 == 0: 329 | tmp = np.sum(norm2_DNN_VA[i + 1 - 12:i + 1]) 330 | h_norm2_DNN_VA.append(1 / 12 * tmp) 331 | print(i) 332 | elif (len(norm2_DNN_VA) - i) < 12: 333 | tmp = np.sum(norm2_DNN_VA[i: len(norm2_DNN_VA)]) 334 | h_norm2_DNN_VA.append(1 / (len(norm2_WLS_VM) - i) * tmp) 335 | break 336 | h_norm2_DNN_VA = np.array(h_norm2_DNN_VA) 337 | h_norm2_DNN_VA = h_norm2_DNN_VA.squeeze() 338 | 339 | h_norm2_WLS_VA = [] 340 | for i in range(len(norm2_WLS_VA)): 341 | if (i + 1) % 12 == 0: 342 | tmp = np.sum(norm2_WLS_VA[i + 1 - 12:i + 1]) 343 | h_norm2_WLS_VA.append(1 / 12 * tmp) 344 | elif (len(norm2_WLS_VA) - i - 1) < 12: 345 | tmp = np.sum(norm2_WLS_VA[i: len(norm2_WLS_VA)]) 346 | h_norm2_WLS_VA.append(1 / (len(norm2_WLS_VA) - i) * tmp) 347 | break 348 | h_norm2_WLS_VA = np.array(h_norm2_WLS_VA) 349 | h_norm2_WLS_VA = h_norm2_WLS_VA.squeeze() 350 | 351 | h_norm2_DNN_VM = [] 352 | for i in range(len(norm2_DNN_VM)): 353 | if (i + 1) % 12 == 0: 354 | tmp = np.sum(norm2_DNN_VM[i + 1 - 12:i + 1]) 355 | h_norm2_DNN_VM.append(1 / 12 * tmp) 356 | elif (len(norm2_DNN_VM) - i - 1) < 12: 357 | tmp = np.sum(norm2_DNN_VM[i: len(norm2_DNN_VM)]) 358 | h_norm2_DNN_VM.append(1 / (len(norm2_DNN_VM) - i) * tmp) 359 | break 360 | h_norm2_DNN_VM = np.array(h_norm2_DNN_VM) 361 | h_norm2_DNN_VM = h_norm2_DNN_VM.squeeze() 362 | 363 | h_norm2_WLS_VM = [] 364 | for i in range(len(norm2_WLS_VM)): 365 | if (i + 1) % 12 == 0: 366 | tmp = np.sum(norm2_WLS_VM[i + 1 - 12:i + 1]) 367 | h_norm2_WLS_VM.append(1 / 12 * tmp) 368 | elif (len(norm2_WLS_VM) - i - 1) < 12: 369 | tmp = np.sum(norm2_WLS_VM[i: len(norm2_WLS_VM)]) 370 | h_norm2_WLS_VM.append(1 / (len(norm2_WLS_VM) - i) * tmp) 371 | break 372 | h_norm2_WLS_VM = np.array(h_norm2_WLS_VM) 373 | h_norm2_WLS_VM = h_norm2_WLS_VM.squeeze() 374 | 375 | print('*****************DNN**************') 376 | print('5min', norm2_DNN_VA[0]) 377 | print('1h', np.sum(norm2_DNN_VA[0:12]) / 12) 378 | print('one day', np.sum(norm2_DNN_VA) / len(norm2_DNN_VA)) 379 | print('*****************WLS**************') 380 | print('5min', norm2_WLS_VA[0]) 381 | print('1h', np.sum(norm2_WLS_VA[0:12]) / 12) 382 | print('one day', np.sum(norm2_WLS_VA) / len(norm2_WLS_VA)) 383 | 384 | print('*****************DNN**************') 385 | print('5min', norm2_DNN_VM[0]) 386 | print('1h', np.sum(norm2_DNN_VM[0:12]) / 12) 387 | print('one day', np.sum(norm2_DNN_VM) / len(norm2_DNN_VM)) 388 | 389 | print('*****************WLS**************') 390 | print('5min', norm2_WLS_VM[0]) 391 | print('1h', np.sum(norm2_WLS_VM[0:12]) / 12) 392 | print('one day', np.sum(norm2_WLS_VM) / 280) 393 | 394 | # print(np.sum(norm2_WLS_VA)) 395 | plt.figure() 396 | p2 = plt.subplot() 397 | # p2 = plt.subplot(122) 398 | width = 0.3 399 | 400 | 401 | # ind = np.arange(len(h_norm2_DNN_VA)) 402 | # # fig, ax = plt.subplots() 403 | # rects1 = p1.bar(ind, h_norm2_DNN_VA, width, color='r') 404 | # rects2 = p1.bar(ind + width, h_norm2_WLS_VA, width, color='b') 405 | # # add some text for labels, title and axes ticks 406 | # p1.set_ylabel('THRMSE', font2) 407 | # p1.set_title('IEEE14 voltage angles',font2) 408 | # # ax.set_xticks(ind + width / 2) 409 | # 410 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 411 | 412 | ind = np.arange(len(norm2_DNN_VM)) 413 | rects3 = p2.bar(ind, norm2_DNN_VM, width, color='r') 414 | rects4 = p2.bar(ind + width, norm2_WLS_VM, width, color='b') 415 | # add some text for labels, title and axes ticks 416 | p2.set_ylabel('THRMSE', font2) 417 | p2.set_title('IEEE14 voltage magnitudes', font2) 418 | p2.legend((rects3[0], rects4[0]), ('DNN', 'WLS')) 419 | 420 | 421 | plt.tick_params(labelsize=15) 422 | plt.show() 423 | 424 | -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE118/IEEE118.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | import math 4 | import time 5 | 6 | import matplotlib.pyplot as plt 7 | import numpy as np 8 | import pandas as pd 9 | import torch 10 | import torch.nn as nn 11 | import torch.nn.functional as F 12 | import torch.utils.data as Data 13 | import xlrd 14 | import xlwt 15 | from torch.autograd import Variable 16 | from tqdm import tqdm 17 | from tqdm import trange 18 | from cyclic_lr_scheduler import CyclicLR 19 | import torch.nn.init as init 20 | from pandas import ExcelWriter 21 | 22 | use_cuda = torch.cuda.is_available() 23 | device = torch.device("cuda:0" if use_cuda else "cpu" ) 24 | print(torch.cuda.get_device_name(torch.cuda.current_device())) 25 | 26 | xls = pd.ExcelFile('measurements.xlsx') 27 | sys_data = pd.read_excel(xls, sheetname='Data', header=None) 28 | sys_data = sys_data.as_matrix() 29 | 30 | G = pd.read_excel(xls, sheetname='Real', header=None) 31 | G = G.as_matrix() 32 | # Imag part 33 | imag = pd.read_excel(xls, sheetname='Imag', header=None) 34 | B = imag.as_matrix() 35 | 36 | # According to the data frame (np. ndarray) 37 | m_type = sys_data[1] # type of the measurements 38 | FB = sys_data[2] # from bus 39 | TB = sys_data[3] # to bus 40 | R = sys_data[4] # covariance 41 | 42 | vi = np.argwhere(m_type == 1) # Type1: V 43 | Vmask = FB[vi] - 1 44 | ppi = np.argwhere(m_type == 2).squeeze() # Type2: Pi 45 | BP_mask = Variable(torch.from_numpy(FB[ppi] - 1).long()).squeeze().to(device) 46 | qi = np.argwhere(m_type == 3).squeeze() # Type3: Qi 47 | BQ_mask = Variable(torch.from_numpy(FB[qi] - 1).long()).squeeze().to(device) 48 | ppf = np.argwhere(m_type == 4).squeeze() # Type4: Pij 49 | PF_FR = Variable(torch.from_numpy(FB[ppf] - 1).long()).squeeze().to(device) 50 | PF_TO = Variable(torch.from_numpy(TB[ppf] - 1).long()).squeeze().to(device) 51 | qf = np.argwhere(m_type == 5).squeeze() # Type5: Qij 52 | QF_FR = Variable(torch.from_numpy(FB[qf] - 1).long()).squeeze().to(device) 53 | QF_TO = Variable(torch.from_numpy(TB[qf] - 1).long()).squeeze().to(device) 54 | 55 | nvi = len(vi) 56 | npi = len(ppi) 57 | nqi = len(qi) 58 | npf = len(ppf) 59 | nqf = len(qf) 60 | 61 | # Load features of the measurements 62 | nBus = 118 # Bus # of targeted system 63 | M = sys_data.shape[1] # Measurements # 64 | nSet = sys_data.shape[0] # Sets # of sys_data 65 | N = 2 * nBus - 1 # State variables # 66 | ref_ang = 30 * math.pi / 180 # reference bus angle 67 | 68 | # Use Variable container 69 | G = Variable(torch.from_numpy(G).float()).to(device) 70 | B = Variable(torch.from_numpy(B).float()).to(device) 71 | 72 | # Mini-batch DataLoader 73 | # Hyper parameters 74 | BATCH_SIZE = 32 75 | LR = 0.001 76 | EPOCH = 300 77 | 78 | iter_size = (len(sys_data)-5) // BATCH_SIZE 79 | sys_data1 = torch.from_numpy(sys_data[5:BATCH_SIZE*iter_size+5,:]).float() 80 | torch_dataset1 = Data.TensorDataset(sys_data1, sys_data1) 81 | loader1 = Data.DataLoader(dataset=torch_dataset1, # torch TensorDataset format 82 | batch_size=BATCH_SIZE, # mini batch size 83 | shuffle=False, # random shuffle for training 84 | num_workers=1, # sub-processes for loading data 85 | drop_last=True, ) 86 | 87 | 88 | sys_data2 = torch.from_numpy(sys_data[5:]).float() 89 | 90 | true_data = pd.read_excel(xls, sheetname='WLS_Train', header=None) 91 | true_data = true_data.as_matrix() 92 | true_data = torch.from_numpy(true_data).float() 93 | 94 | torch_dataset2 = Data.TensorDataset(sys_data2, true_data) 95 | loader2 = Data.DataLoader(dataset=torch_dataset2, # torch TensorDataset format 96 | batch_size=BATCH_SIZE, # mini batch size 97 | shuffle=False, # random shuffle for training 98 | num_workers=2, # sub-processes for loading data 99 | drop_last=True, 100 | ) 101 | 102 | 103 | 104 | # Build up the NN module 105 | class Net(torch.nn.Module): 106 | def __init__(self): 107 | super(Net, self).__init__() 108 | self.hidden1 = torch.nn.Linear(M, 512) 109 | self.hidden2 = torch.nn.Linear(512, 512) 110 | self.hidden3 = torch.nn.Linear(512, 512) 111 | self.hidden4 = torch.nn.Linear(512, 512) 112 | self.hidden5 = torch.nn.Linear(512, 512) 113 | # self.hidden3 = torch.nn.Linear(1024, 1024) 114 | self.output = torch.nn.Linear(512, N) 115 | 116 | def forward(self, x): 117 | x = torch.tanh(self.hidden1(x)) 118 | x = torch.tanh(self.hidden2(x)) # replace sigmoid(), cz it is too slow here 119 | x = torch.tanh(self.hidden3(x)) 120 | x = torch.tanh(self.hidden4(x)) 121 | x = torch.tanh(self.hidden5(x)) 122 | # x = torch.sigmoid(self.hidden3(x)) 123 | x = self.output(x) 124 | return x 125 | 126 | 127 | def weight_init(m): 128 | ''' 129 | Usage: 130 | model = Model() 131 | model.apply(weight_init) 132 | ''' 133 | if isinstance(m, nn.Conv1d): 134 | init.normal_(m.weight.data) 135 | if m.bias is not None: 136 | init.normal_(m.bias.data) 137 | elif isinstance(m, nn.Conv2d): 138 | init.xavier_normal_(m.weight.data) 139 | if m.bias is not None: 140 | init.normal_(m.bias.data) 141 | elif isinstance(m, nn.Conv3d): 142 | init.xavier_normal_(m.weight.data) 143 | if m.bias is not None: 144 | init.normal_(m.bias.data) 145 | elif isinstance(m, nn.ConvTranspose1d): 146 | init.normal_(m.weight.data) 147 | if m.bias is not None: 148 | init.normal_(m.bias.data) 149 | elif isinstance(m, nn.ConvTranspose2d): 150 | init.xavier_normal_(m.weight.data) 151 | if m.bias is not None: 152 | init.normal_(m.bias.data) 153 | elif isinstance(m, nn.ConvTranspose3d): 154 | init.xavier_normal_(m.weight.data) 155 | if m.bias is not None: 156 | init.normal_(m.bias.data) 157 | elif isinstance(m, nn.BatchNorm1d): 158 | init.normal_(m.weight.data, mean=1, std=0.02) 159 | init.constant_(m.bias.data, 0) 160 | elif isinstance(m, nn.BatchNorm2d): 161 | init.normal_(m.weight.data, mean=1, std=0.02) 162 | init.constant_(m.bias.data, 0) 163 | elif isinstance(m, nn.BatchNorm3d): 164 | init.normal_(m.weight.data, mean=1, std=0.02) 165 | init.constant_(m.bias.data, 0) 166 | elif isinstance(m, nn.Linear): 167 | init.xavier_normal_(m.weight.data) 168 | init.normal_(m.bias.data) 169 | elif isinstance(m, nn.LSTM): 170 | for param in m.parameters(): 171 | if len(param.shape) >= 2: 172 | init.orthogonal_(param.data) 173 | else: 174 | init.normal_(param.data) 175 | elif isinstance(m, nn.LSTMCell): 176 | for param in m.parameters(): 177 | if len(param.shape) >= 2: 178 | init.orthogonal_(param.data) 179 | else: 180 | init.normal_(param.data) 181 | elif isinstance(m, nn.GRU): 182 | for param in m.parameters(): 183 | if len(param.shape) >= 2: 184 | init.orthogonal_(param.data) 185 | else: 186 | init.normal_(param.data) 187 | elif isinstance(m, nn.GRUCell): 188 | for param in m.parameters(): 189 | if len(param.shape) >= 2: 190 | init.orthogonal_(param.data) 191 | else: 192 | init.normal_(param.data) 193 | 194 | 195 | # Reload the module after initialization 196 | estimator = Net() 197 | print(estimator) 198 | estimator.to(device) 199 | optimizer = torch.optim.Adam(estimator.parameters(), lr=LR, betas=(0.9, 0.9)) 200 | loss_func = torch.nn.MSELoss(reduction='mean').to(device) 201 | l2 = torch.nn.MSELoss(reduction='sum').to(device) 202 | 203 | # Power Injection 204 | GP = G[BP_mask] 205 | BP = B[BP_mask] 206 | GQ = G[BQ_mask] 207 | BQ = B[BQ_mask] 208 | # Power Flow 209 | GPF = G[PF_FR, PF_TO].unsqueeze(1) 210 | BPF = B[PF_FR, PF_TO].unsqueeze(1) 211 | GQF = G[QF_FR, QF_TO].unsqueeze(1) 212 | BQF = B[QF_FR, QF_TO].unsqueeze(1) 213 | 214 | 215 | def power_flow(outputs): 216 | outputs = outputs.squeeze(0) 217 | outputs = outputs.permute(1, 0) 218 | Z_hat = Variable(torch.zeros(M, 1)).to(device) 219 | A = Variable(ref_ang * torch.ones(nBus, 1)).to(device) 220 | A[:68] = outputs[0:68] # voltage angle 221 | A[69:] = outputs[68:nBus - 1] # voltage angle 222 | V = outputs[nBus - 1:] # voltage magnitude 223 | 224 | ## V 225 | Z_hat[vi, :] = V[Vmask] 226 | 227 | ## Pi 228 | VP_FR = V[BP_mask].repeat(1, nBus) 229 | VP_TO = V.repeat(1, nBus).permute(1, 0)[BP_mask] 230 | 231 | AP_FR = A[BP_mask].repeat(1, nBus) 232 | AP_TO = A.repeat(1, nBus).permute(1, 0)[BP_mask] 233 | 234 | temp = VP_FR * VP_TO * (GP * torch.cos(AP_FR - AP_TO) + BP * torch.sin(AP_FR - AP_TO)) 235 | Z_hat[ppi, :] = torch.sum(temp, 1, keepdim=True) 236 | 237 | ## Qi 238 | VQ_FR = V[BQ_mask].repeat(1, nBus) 239 | VQ_TO = V.repeat(1, nBus).permute(1, 0)[BQ_mask] 240 | 241 | AQ_FR = A[BQ_mask].repeat(1, nBus) 242 | AQ_TO = A.repeat(1, nBus).permute(1, 0)[BQ_mask] 243 | 244 | temp = VQ_FR * VQ_TO * (GQ * torch.sin(AQ_FR - AQ_TO) - BQ * torch.cos(AQ_FR - AQ_TO)) 245 | Z_hat[qi, :] = torch.sum(temp, 1, keepdim=True) 246 | 247 | ## Pij 248 | Z_hat[ppf, :] = -V[PF_FR] * V[PF_FR] * GPF - V[PF_FR] * V[PF_TO] * ( 249 | -GPF * torch.cos(A[PF_FR] - A[PF_TO]) - BPF * torch.sin(A[PF_FR] - A[PF_TO])) 250 | 251 | # Qij 252 | Z_hat[qf, :] = V[QF_FR] * V[QF_FR] * BQF - V[QF_FR] * V[QF_TO] * ( 253 | -GQF * torch.sin(A[QF_FR] - A[QF_TO]) + BQF * torch.cos(A[QF_FR] - A[QF_TO])) 254 | 255 | # return Z_hat.permute(1, 0) 256 | return Z_hat.squeeze() 257 | 258 | 259 | ######################################## 260 | ##Batchsize, Build up 3D operation 261 | ######################################## 262 | # Power Injection 263 | B_GP = G[BP_mask].repeat(BATCH_SIZE, 1, 1) 264 | B_BP = B[BP_mask].repeat(BATCH_SIZE, 1, 1) 265 | B_GQ = G[BQ_mask].repeat(BATCH_SIZE, 1, 1) 266 | B_BQ = B[BQ_mask].repeat(BATCH_SIZE, 1, 1) 267 | # Power Flow 268 | B_GPF = G[PF_FR, PF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 269 | B_BPF = B[PF_FR, PF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 270 | B_GQF = G[QF_FR, QF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 271 | B_BQF = B[QF_FR, QF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 272 | 273 | 274 | def power_flow_batch(outputs): 275 | outputs = outputs.permute(1,2,0) 276 | Z_hat = Variable(torch.zeros(BATCH_SIZE, M, 1)).to(device) 277 | A = Variable(ref_ang * torch.ones(BATCH_SIZE, nBus, 1)).to(device) 278 | A[:, :68] = outputs[:, 0:68] # voltage angle 279 | A[:, 69:] = outputs[:, 68:nBus - 1] # voltage angle 280 | V = outputs[:, nBus - 1:] # voltage magnitude 281 | 282 | ## V 283 | Z_hat[:, vi, :] = V[:, Vmask, :] 284 | ## Pi 285 | B_VP_FR = V[:, BP_mask].repeat(1, 1, nBus) 286 | B_VP_TO = V.repeat(1, 1, nBus).permute(0, 2, 1)[:, BP_mask] 287 | 288 | B_AP_FR = A[:, BP_mask].repeat(1, 1, nBus) 289 | B_AP_TO = A.repeat(1, 1, nBus).permute(0, 2, 1)[:, BP_mask] 290 | 291 | temp = B_VP_FR * B_VP_TO * (B_GP * torch.cos(B_AP_FR - B_AP_TO) + B_BP * torch.sin(B_AP_FR - B_AP_TO)) 292 | Z_hat[:, ppi, :] = torch.sum(temp, 2, keepdim=True) 293 | 294 | ## Qi 295 | B_VQ_FR = V[:, BQ_mask].repeat(1, 1, nBus) 296 | B_VQ_TO = V.repeat(1, 1, nBus).permute(0, 2, 1)[:, BQ_mask] 297 | 298 | B_AQ_FR = A[:, BQ_mask].repeat(1, 1, nBus) 299 | B_AQ_TO = A.repeat(1, 1, nBus).permute(0, 2, 1)[:, BQ_mask] 300 | 301 | temp = B_VQ_FR * B_VQ_TO * (B_GQ * torch.sin(B_AQ_FR - B_AQ_TO) - B_BQ * torch.cos(B_AQ_FR - B_AQ_TO)) 302 | Z_hat[:, qi, :] = torch.sum(temp, 2, keepdim=True) 303 | ## Pij 304 | Z_hat[:, ppf, :] = -V[:, PF_FR] * V[:, PF_FR] * B_GPF - V[:, PF_FR] * V[:, PF_TO] * ( 305 | -B_GPF * torch.cos(A[:, PF_FR] - A[:, PF_TO]) - B_BPF * torch.sin(A[:, PF_FR] - A[:, PF_TO])) 306 | 307 | # Qij 308 | Z_hat[:, qf, :] = V[:, QF_FR] * V[:, QF_FR] * B_BQF - V[:, QF_FR] * V[:, QF_TO] * ( 309 | -B_GQF * torch.sin(A[:, QF_FR] - A[:, QF_TO]) + B_BQF * torch.cos(A[:, QF_FR] - A[:, QF_TO])) 310 | 311 | return Z_hat.squeeze(2) 312 | 313 | 314 | def batch_train_params(): 315 | print('Start Initializing...') 316 | estimator.apply(weight_init) 317 | scheduler = CyclicLR(optimizer, base_lr=1e-7, max_lr=1e-3, step_size=300, mode='triangular') 318 | with trange(0, 50) as numEpoch: 319 | for epoch in numEpoch: 320 | scheduler.step() 321 | for step, (batch_train, batch_target) in enumerate(loader2): 322 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 323 | inputs = Variable(batch_train, requires_grad=True).to(device) 324 | targets = Variable(batch_target).to(device) 325 | outputs= estimator(inputs) 326 | loss = loss_func(outputs, targets) 327 | optimizer.zero_grad() 328 | loss.backward() 329 | optimizer.step() 330 | # numEpoch.set_postfix(Loss='%0.32f' % loss) 331 | print('Loss=%0.8f' % loss) 332 | torch.save(estimator.state_dict(), 'initial_batch_params.pkl') 333 | return loss 334 | 335 | # def batch_train_params(): 336 | # estimator.apply(weight_init) 337 | # # Flat start to initialize the parameters of module 338 | # init_sv = torch.ones(N) 339 | # init_sv[:nBus - 1] = ref_ang * init_sv[:nBus - 1] 340 | # init_sv = init_sv.repeat(BATCH_SIZE, 1).to(device) 341 | # 342 | # with trange(0, 200) as numEpoch: 343 | # for epoch in numEpoch: 344 | # # scheduler.step() 345 | # for step, (batch_train, _) in enumerate(loader): 346 | # batch_train = batch_train.view(1, batch_train.shape[0], 347 | # batch_train.shape[1]) # (seq_len, batch, input_size) 348 | # # init_sv = init_sv.view(1, init_sv.shape[0], init_sv.shape[1]) 349 | # inputs = Variable(batch_train, requires_grad=True).to(device) 350 | # targets = Variable(init_sv).to(device) 351 | # 352 | # def closure(): 353 | # # zero out the gradients 354 | # optimizer.zero_grad() 355 | # # get the output sequence from the input and the initial hidden and cell states 356 | # output = estimator(inputs) 357 | # # calculate the loss 358 | # loss = loss_func(output, targets) 359 | # # print(loss.item()) 360 | # # calculate the gradients 361 | # loss.backward() 362 | # return loss 363 | # 364 | # epochloss = optimizer.step(closure) 365 | # numEpoch.set_postfix(Loss='%0.16f' % epochloss) 366 | # torch.save(estimator.state_dict(), 'initial_batch_params.pkl') 367 | 368 | 369 | def train(): 370 | print('Training...') 371 | estimator.load_state_dict(torch.load('initial_batch_params.pkl')) 372 | scheduler = CyclicLR(optimizer, base_lr=1e-8, max_lr=1e-5, step_size=300, mode='triangular') 373 | 374 | with trange(0, EPOCH) as numEPoch: 375 | for epoch in numEPoch: 376 | total_loss = 0 377 | scheduler.step() 378 | optimizer.zero_grad() 379 | for step, (batch_train, batch_targets) in enumerate(loader1): 380 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 381 | inputs = Variable(batch_train, requires_grad=True).to(device) 382 | targets = Variable(batch_targets).to(device) 383 | 384 | # optimizer.zero_grad() 385 | # get the output sequence from the input and the initial hidden and cell states 386 | outputs = estimator(inputs) 387 | Z_hat = power_flow_batch(outputs) 388 | # calculate the loss 389 | loss = loss_func(Z_hat, targets)/iter_size 390 | # calculate the gradients 391 | loss.backward() 392 | total_loss += loss 393 | optimizer.step() 394 | 395 | # def closure(): 396 | # # zero out the gradients 397 | # optimizer.zero_grad() 398 | # # get the output sequence from the input and the initial hidden and cell states 399 | # outputs = estimator(inputs) 400 | # Z_hat = power_flow_batch(outputs) 401 | # # calculate the loss 402 | # loss = loss_func(Z_hat, targets) 403 | # # print(loss.item()) 404 | # # calculate the gradients 405 | # loss.backward() 406 | # return loss 407 | # epochloss = optimizer.step(closure) 408 | numEPoch.set_postfix(Loss='%0.8f' % total_loss) # print error 409 | # print('Loss=%0.8f' % total_loss) 410 | torch.save(estimator.state_dict(), 'final_params.pkl') 411 | return loss 412 | 413 | 414 | # Load streaming data 415 | stream_data = pd.read_excel(xls, sheetname='TestData', header=None) 416 | stream_data = stream_data.as_matrix() 417 | # stream_data = stream_data.T 418 | stream_data = torch.from_numpy(stream_data).float() 419 | stream_torch_dataset = Data.TensorDataset(stream_data, stream_data) 420 | stream_loader = Data.DataLoader(dataset=stream_torch_dataset, batch_size=1, shuffle=False, 421 | # random shuffle for training 422 | num_workers=2, # sub-processes for loading data 423 | ) 424 | 425 | 426 | def pfm_test(): 427 | ########################################################### 428 | weights_SP = [] 429 | with torch.no_grad(): 430 | for param in estimator.parameters(): 431 | weights_SP.append(param.clone()) 432 | ########################################################### 433 | 434 | for param_group in optimizer.param_groups: 435 | param_group['lr'] = 1e-8 436 | # estimator.load_state_dict(torch.load('final_params.pkl')) 437 | # print(estimator) 438 | print('Online Training...') 439 | file = xlwt.Workbook() 440 | # his_loss = [] 441 | for step, (batch_train, batch_targets) in enumerate(stream_loader): 442 | inputs = batch_train.view((1, batch_train.shape[0], batch_train.shape[1])).to(device).requires_grad_() 443 | targets = batch_targets.to(device) 444 | targets = targets.squeeze() 445 | 446 | outputs = estimator(inputs) 447 | 448 | Z_hat = power_flow(outputs) 449 | Z_hat = Z_hat.squeeze() 450 | loss = loss_func(Z_hat, targets) 451 | 452 | # norm2 = 0 453 | # for n, param in enumerate(estimator.parameters()): 454 | # norm2 = norm2 + l2(param, weights_SP[n]) 455 | # loss = loss_func(Z_hat, targets) + 0.5 * 0.5 * norm2 # (1/2 * alpha * l2(weights)) 456 | 457 | optimizer.zero_grad() 458 | loss.backward() 459 | optimizer.step() 460 | 461 | outputs = outputs.squeeze() 462 | if step > 16261: 463 | sheet = file.add_sheet(str(step), cell_overwrite_ok=True) 464 | for j in range(len(outputs)): 465 | sheet.write(j, 0, outputs[j].item()) 466 | # sheet1 = file.add_sheet('loss') 467 | # for j in range(len(his_loss)): 468 | # sheet1.write(j, 0, his_loss[j]) 469 | ffilename = 'dnn-test.xls' 470 | file.save(ffilename) 471 | 472 | 473 | 474 | 475 | def outlierfactor(): 476 | print('Outlier Factor...') 477 | estimator.load_state_dict(torch.load('final_params.pkl')) 478 | EZ = torch.zeros(sys_data1.shape[0], sys_data1.shape[1]) 479 | states = torch.zeros(sys_data1.shape[0], 235) 480 | for step, (batch_train, batch_targets) in enumerate(loader1): 481 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 482 | inputs = Variable(batch_train, requires_grad=True).to(device) 483 | targets = Variable(batch_targets).to(device) 484 | 485 | outputs = estimator(inputs) 486 | Z_hat = power_flow(outputs) 487 | 488 | EZ[step, :] = Z_hat 489 | states[step, :] = outputs 490 | diff = (EZ-sys_data1).mul(EZ-sys_data1) 491 | 492 | dfEZ = pd.DataFrame(EZ.detach().numpy()) 493 | dfdiff= pd.DataFrame(diff.detach().numpy()) 494 | dfstates = pd.DataFrame(states.detach().numpy()) 495 | writer = ExcelWriter('TrainingData_Excel.xlsx') 496 | dfEZ.to_excel(writer, 'Zhat', index=False) 497 | dfdiff.to_excel(writer, 'Difference', index=False) 498 | dfstates.to_excel(writer, 'States', index=False) 499 | writer.save() 500 | 501 | # OF = torch.sum(diff,0) / sys_data1.shape[0] 502 | # file = xlwt.Workbook() 503 | # sheet = file.add_sheet('OutlierFactor') 504 | # for j in range(len(OF)): 505 | # sheet.write(j, 0, OF[j].item()) 506 | # ffilename = 'TrainOutlierFactor.xls' 507 | # file.save(ffilename) 508 | 509 | 510 | # def outlierfactor(): 511 | # print('Outlier Factor...') 512 | # estimator.load_state_dict(torch.load('final_params.pkl')) 513 | # EZ = torch.zeros(stream_data.shape[0], stream_data.shape[1]) 514 | # states = torch.zeros(stream_data.shape[0], 235) 515 | # for step, (batch_train, batch_targets) in enumerate(stream_loader): 516 | # batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 517 | # inputs = Variable(batch_train, requires_grad=True).to(device) 518 | # targets = Variable(batch_targets).to(device) 519 | # 520 | # outputs = estimator(inputs) 521 | # Z_hat = power_flow(outputs) 522 | # 523 | # EZ[step, :] = Z_hat 524 | # states[step, :] = outputs 525 | # 526 | # diff = (EZ - stream_data).mul(EZ - stream_data) 527 | # 528 | # dfEZ = pd.DataFrame(EZ.detach().numpy()) 529 | # dfdiff= pd.DataFrame(diff.detach().numpy()) 530 | # dfstates = pd.DataFrame(states.detach().numpy()) 531 | # writer = ExcelWriter('TestingData_Excel.xlsx') 532 | # dfEZ.to_excel(writer, 'Zhat', index=False) 533 | # dfdiff.to_excel(writer, 'Difference', index=False) 534 | # dfstates.to_excel(writer, 'States', index=False) 535 | # writer.save() 536 | # 537 | # 538 | # 539 | # 540 | # # OF = torch.sum(diff, 0) / stream_data.shape[0] 541 | # # file = xlwt.Workbook() 542 | # # sheet = file.add_sheet('OutlierFactorTest') 543 | # # for j in range(len(OF)): 544 | # # sheet.write(j, 0, OF[j].item()) 545 | # # ffilename = 'TestOutlierFactor.xls' 546 | # # file.save(ffilename) 547 | 548 | 549 | 550 | 551 | 552 | def main(): 553 | # batch_train_params() 554 | train() 555 | # pfm_test() 556 | # outlierfactor() 557 | 558 | 559 | if __name__ == "__main__": 560 | main() 561 | -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE118/Readme: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE118/cyclic_lr_scheduler.py: -------------------------------------------------------------------------------- 1 | import math 2 | import numpy as np 3 | from torch.optim.optimizer import Optimizer 4 | 5 | 6 | class _LRScheduler(object): 7 | def __init__(self, optimizer, last_epoch=-1): 8 | if not isinstance(optimizer, Optimizer): 9 | raise TypeError('{} is not an Optimizer'.format( 10 | type(optimizer).__name__)) 11 | self.optimizer = optimizer 12 | if last_epoch == -1: 13 | for group in optimizer.param_groups: 14 | group.setdefault('initial_lr', group['lr']) 15 | else: 16 | for i, group in enumerate(optimizer.param_groups): 17 | if 'initial_lr' not in group: 18 | raise KeyError("param 'initial_lr' is not specified " 19 | "in param_groups[{}] when resuming an optimizer".format(i)) 20 | self.base_lrs = list(map(lambda group: group['initial_lr'], optimizer.param_groups)) 21 | self.step(last_epoch + 1) 22 | self.last_epoch = last_epoch 23 | 24 | def get_lr(self): 25 | raise NotImplementedError 26 | 27 | def step(self, epoch=None): 28 | if epoch is None: 29 | epoch = self.last_epoch + 1 30 | self.last_epoch = epoch 31 | for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): 32 | param_group['lr'] = lr 33 | 34 | 35 | class CyclicLR(_LRScheduler): 36 | 37 | def __init__(self, optimizer, base_lr, max_lr, step_size, gamma=0.99, mode='triangular', last_epoch=-1): 38 | self.optimizer = optimizer 39 | self.base_lr = base_lr 40 | self.max_lr = max_lr 41 | self.step_size = step_size 42 | self.gamma = gamma 43 | self.mode = mode 44 | assert mode in ['triangular', 'triangular2', 'exp_range'] 45 | super(CyclicLR, self).__init__(optimizer, last_epoch) 46 | 47 | def get_lr(self): 48 | new_lr = [] 49 | # make sure that the length of base_lrs doesn't change. Dont care about the actual value 50 | for base_lr in self.base_lrs: 51 | cycle = np.floor(1 + self.last_epoch / (2 * self.step_size)) 52 | x = np.abs(float(self.last_epoch) / self.step_size - 2 * cycle + 1) 53 | if self.mode == 'triangular': 54 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) 55 | elif self.mode == 'triangular2': 56 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) / float(2 ** (cycle - 1)) 57 | elif self.mode == 'exp_range': 58 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) * (self.gamma ** ( 59 | self.last_epoch)) 60 | new_lr.append(lr) 61 | return new_lr -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE118/dnn-test.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE118/dnn-test.xls -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE118/ffnn.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE118/ffnn.xls -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE118/final_params.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE118/final_params.pkl -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE118/initial_batch_params.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE118/initial_batch_params.pkl -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE118/integratedata.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import xlwt 4 | 5 | xls = pd.ExcelFile('dnn-test.xls') 6 | total = np.zeros(235) 7 | for i in range(16262, 17133): 8 | sys_data = pd.read_excel(xls, sheetname=str(i), header=None) 9 | sys_data = sys_data.squeeze() 10 | # sys_data = sys_data.as_matrix() 11 | # print(total.shape) 12 | # print(sys_data.shape) 13 | total = np.vstack((total, sys_data)) 14 | total = total[1:,:] 15 | _r, _c = total.shape 16 | file = xlwt.Workbook() 17 | sheet = file.add_sheet('Sheet1') 18 | for r in range(_r): 19 | for c in range(_c): 20 | sheet.write(r, c, total[r, c]) 21 | file.save('ffnn.xls') 22 | 23 | -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/01.py: -------------------------------------------------------------------------------- 1 | # import matplotlib.pyplot as plt 2 | # import xlrd 3 | # import numpy as np 4 | # import pandas as pd 5 | # from numpy import linalg as LA 6 | # import xlwt 7 | # 8 | # # data_sheet = xlrd.open_workbook('result.xls') 9 | # # dataset = data_sheet.sheets()[0] 10 | # 11 | # 12 | # 13 | # real = pd.read_excel('./Results/real.xlsx', sheetname='Sheet1', header=None) 14 | # real = real.as_matrix() 15 | # real_angle = real[-288:, 0:13] # 7000:8000 16 | # real_voltage = real[-288:, 13:] 17 | # 18 | # h_real_voltage = [] 19 | # for i in range(24): 20 | # tmp = np.sum(h_real_voltage[i * 5:(i + 1) * 5 - 1]) 21 | # h_real_voltage.append(1/12*tmp) 22 | # h_real_voltage = np.array(h_real_voltage) 23 | # h_real_voltage = h_real_voltage.squeeze() 24 | # 25 | # dnn = pd.read_excel('./Results/dnn-test-total.xls', sheetname='Sheet1', header=None) 26 | # dnn = dnn.as_matrix() 27 | # # sys_data = sys_data.T 28 | # dnn_angle = dnn[:, 0:13] 29 | # dnn_voltage = dnn[:, 13:] 30 | # 31 | # wls = pd.read_excel('./Results/wls.xlsx', sheetname='Sheet1', header=None) 32 | # wls = wls.as_matrix() 33 | # wls_angle = wls[-288:, 0:13] 34 | # wls_voltage = wls[-288:, 13:] 35 | # 36 | # 37 | # 38 | # wls_real_angle = (wls_angle - real_angle) ** 2 39 | # wls_real_voltage = (wls_voltage - real_voltage) ** 2 40 | # 41 | # dnn_real_angle = (dnn_angle - real_angle) ** 2 42 | # dnn_real_voltage = (dnn_voltage - real_voltage) ** 2 43 | # norm2_DNN_VA = 1 / dnn_real_angle.shape[1] * np.sqrt(np.sum(dnn_real_angle, axis=1)) 44 | # norm2_WLS_VA = 1 / wls_real_angle.shape[1] * np.sqrt(np.sum(wls_real_angle, axis=1)) 45 | # norm2_DNN_VM = 1 / dnn_real_voltage.shape[1] * np.sqrt(np.sum(dnn_real_voltage, axis=1)) 46 | # norm2_WLS_VM = 1 / wls_real_voltage.shape[1] * np.sqrt(np.sum(wls_real_voltage, axis=1)) 47 | # 48 | # 49 | # h_norm2_DNN_VA = [] 50 | # for i in range(24): 51 | # tmp = np.sum(norm2_DNN_VA[i * 5:(i + 1) * 5 - 1]) 52 | # h_norm2_DNN_VA.append(1/12*tmp) 53 | # h_norm2_DNN_VA = np.array(h_norm2_DNN_VA) 54 | # h_norm2_DNN_VA = h_norm2_DNN_VA.squeeze() 55 | # 56 | # h_norm2_WLS_VA = [] 57 | # for i in range(24): 58 | # tmp = np.sum(norm2_WLS_VA[i * 12:(i + 1) * 12]) 59 | # h_norm2_WLS_VA.append(1/12*tmp) 60 | # h_norm2_WLS_VA = np.array(h_norm2_WLS_VA) 61 | # h_norm2_WLS_VA = h_norm2_WLS_VA.squeeze() 62 | # 63 | # h_norm2_DNN_VM = [] 64 | # for i in range(24): 65 | # tmp = np.sum(norm2_DNN_VM[i * 12:(i + 1) * 12 ]) 66 | # h_norm2_DNN_VM.append(1/12*tmp) 67 | # h_norm2_DNN_VM = np.array(h_norm2_DNN_VM) 68 | # h_norm2_DNN_VM = h_norm2_DNN_VM.squeeze() 69 | # 70 | # h_norm2_WLS_VM = [] 71 | # for i in range(24): 72 | # tmp = np.sum(norm2_WLS_VM[i * 12:(i + 1) * 12]) 73 | # h_norm2_WLS_VM.append(1/12*tmp) 74 | # h_norm2_WLS_VM = np.array(h_norm2_WLS_VM) 75 | # h_norm2_WLS_VM = h_norm2_WLS_VM.squeeze() 76 | # 77 | # ''' 78 | # norm2_DNN_VA, norm2_WLS_VA, norm2_DNN_VM, norm2_WLS_VM = [], [], [], [] 79 | # for i in range(100): 80 | # 81 | # norm2_DNN_VA.append(LA.norm(dnn_angle - real_angle)) 82 | # norm2_WLS_VA.append(LA.norm(wls_angle - real_angle)) 83 | # norm2_DNN_VM.append(LA.norm(dnn_voltage - real_voltage)) 84 | # norm2_WLS_VM.append(LA.norm(wls_voltage - real_voltage)) 85 | # 86 | # print('norm2_DNN_VA: ', LA.norm(dnn_angle - real_angle)) 87 | # print('norm2_WLS_VA: ', LA.norm(wls_angle - real_angle)) 88 | # 89 | # print('norm2_DNN_VM: ', LA.norm(dnn_voltage - real_voltage)) 90 | # print('norm2_WLS_VM: ', LA.norm(wls_voltage - real_voltage)) 91 | # print(50 * '*') 92 | # 93 | # file = xlwt.Workbook() 94 | # sheet = file.add_sheet('sheet1', cell_overwrite_ok=True) 95 | # for i in range(100): 96 | # # print(type(measurement)) 97 | # sheet.write(i, 0, norm2_DNN_VA[i]) 98 | # sheet.write(i, 1, norm2_WLS_VA[i]) 99 | # sheet.write(i, 2, norm2_DNN_VM[i]) 100 | # sheet.write(i, 3, norm2_WLS_VM[i]) 101 | # file.save('Euclidean.xls') 102 | # ''' 103 | # 104 | # ''' 105 | # # 设置图例并且设置图例的字体及大小 106 | # font1 = {'family': 'Times New Roman', 107 | # 'weight': 'normal', 108 | # 'size': 12, 109 | # } 110 | # 111 | # # 设置坐标刻度值的大小以及刻度值的字体 112 | # # plt.tick_params(labelsize=15) 113 | # 114 | # font2 = {'family' : 'Times New Roman', 115 | # 'weight' : 'normal', 116 | # 'size' : 14, 117 | # } 118 | # 119 | # angle_axis = np.arange(1, 14, 1) 120 | # print('angle') 121 | # p1.plot(angle_axis, dnn_angle, 'x-', color='red', label='DNN', linewidth=1.0) 122 | # p1.plot(angle_axis, wls_angle, '*-', color='green', label='WLS', linewidth=1.0) 123 | # p1.plot(angle_axis, real_angle, '.-', color='blue', label='Real', linestyle='--') 124 | # p1.set_xlabel('Bus Number', font2) 125 | # p1.set_ylabel('Voltage Angle(degree)', font2) 126 | # p1.set_xticks(angle_axis) 127 | # p1.grid(axis='y') 128 | # p1.legend() 129 | # # 130 | # magnitude_axis = np.arange(1, 15, 1) 131 | # print('magnitude') 132 | # p2.plot(magnitude_axis, dnn_voltage, 'x-', color='red', label='DNN', linewidth=1.0) 133 | # p2.plot(magnitude_axis, wls_voltage, '*-', color='green', label='WLS', linewidth=1.0) 134 | # p2.plot(magnitude_axis, real_voltage, '.-', color='blue', label='Real', linestyle='--') 135 | # p2.set_xlabel('Bus Number', font2) 136 | # p2.set_ylabel('Voltage Magnitude(pu)', font2) 137 | # p2.set_xticks(magnitude_axis) 138 | # p2.grid(axis='y') 139 | # p2.legend() 140 | # 141 | # # legend = plt.legend(prop=font1) 142 | # # plt.xticks(x_axis) 143 | # # plt.grid(axis='y') 144 | # plt.show() 145 | # 146 | # exit() 147 | # ''' 148 | # # plt.tick_params(labelsize=15) 149 | # 150 | # font2 = {'family' : 'Times New Roman', 151 | # 'weight' : 'normal', 152 | # 'size' : 14, 153 | # } 154 | # 155 | # 156 | # # ''' 157 | # plt.figure() 158 | # p1 = plt.subplot() 159 | # # p2 = plt.subplot(122) 160 | # width = 0.3 161 | # ind = np.arange(len(h_norm2_DNN_VA)) 162 | # # fig, ax = plt.subplots() 163 | # rects1 = p1.bar(ind, h_norm2_DNN_VA, width, color='r') 164 | # rects2 = p1.bar(ind + width, h_norm2_WLS_VA, width, color='b') 165 | # 166 | # print('*****************DNN**************') 167 | # print('5min',norm2_DNN_VA[0]) 168 | # print('1h',np.sum(norm2_DNN_VA[0:12])/12) 169 | # print('one day',np.sum(norm2_DNN_VA) / len(norm2_DNN_VA)) 170 | # print('*****************WLS**************') 171 | # print('5min',norm2_WLS_VA[0]) 172 | # print('1h',np.sum(norm2_WLS_VA[0:12])/12) 173 | # print('one day',np.sum(norm2_WLS_VA) / len(norm2_WLS_VA)) 174 | # # add some text for labels, title and axes ticks 175 | # p1.set_ylabel('RMSE', font2) 176 | # p1.set_title('IEEE14 voltage angles', font2) 177 | # # ax.set_xticks(ind + width / 2) 178 | # 179 | # 180 | # # ind = np.arange(len(h_norm2_DNN_VM)) 181 | # # rects3 = p2.bar(ind, h_norm2_DNN_VM, width, color='r') 182 | # # rects4 = p2.bar(ind + width, h_norm2_WLS_VM, width, color='b') 183 | # # print('*****************DNN**************') 184 | # # print('5min',norm2_DNN_VM[0]) 185 | # # print('1h',np.sum(norm2_DNN_VM[0:12])/12) 186 | # # print('one day',np.sum(norm2_DNN_VM) / len(norm2_DNN_VM)) 187 | # # 188 | # # print('*****************WLS**************') 189 | # # print('5min',norm2_WLS_VM[0]) 190 | # # print('1h',np.sum(norm2_WLS_VM[0:12])/12) 191 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 192 | # # 193 | # # # add some text for labels, title and axes ticks 194 | # # p2.set_ylabel('RMSE', font2) 195 | # # p2.set_title('IEEE14 voltage magnitudes', font2) 196 | # # # ax.set_xticks(ind + width / 2) 197 | # 198 | # 199 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 200 | # # p2.legend((rects3[0], rects4[0]), ('DNN', 'WLS')) 201 | # plt.show() 202 | # ''' 203 | # 204 | # #plot msr_rmse 205 | # width = 0.5 206 | # plt.figure() 207 | # p1 = plt.subplot() 208 | # wls_msr_rmse = pd.read_excel('./Results/msr_rmse.xlsx', sheetname='rmse', header=None) 209 | # wls_msr_rmse = wls_msr_rmse [584:] 210 | # h_wls_msr_rmse = [] 211 | # for i in range(24): 212 | # tmp = np.sum(wls_msr_rmse[i * 5:(i + 1) * 5 - 1]) 213 | # h_wls_msr_rmse.append(1/12*tmp) 214 | # h_wls_msr_rmse = np.array(h_wls_msr_rmse) 215 | # h_wls_msr_rmse = h_wls_msr_rmse.squeeze() 216 | # # wls_msr_rmse = wls_msr_rmse.as_matrix() 217 | # print('*****************WLS**************') 218 | # # print('5min',wls_msr_rmse[0]) 219 | # # print('1h',np.sum(wls_msr_rmse[0:12])/12) 220 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 221 | # 222 | # # p1.plot(wls_msr_rmse) 223 | # 224 | # 225 | # 226 | # dnn_msr_mse = pd.read_excel('./Results/dnn.xls', sheetname='loss', header=None) 227 | # # dnn_msr_mse = dnn_msr_mse.as_matrix() 228 | # dnn_msr_rmse = np.sqrt(dnn_msr_mse) 229 | # dnn_msr_rmse = dnn_msr_rmse[584:] 230 | # 231 | # h_dnn_msr_rmse = [] 232 | # for j in range(24): 233 | # tmp = np.sum(dnn_msr_rmse[ j*5:((j + 1)*5 - 1)]) 234 | # h_dnn_msr_rmse.append(1/12*tmp) 235 | # h_dnn_msr_rmse = np.array(h_dnn_msr_rmse) 236 | # h_dnn_msr_rmse = h_dnn_msr_rmse.squeeze() 237 | # print('*****************DNN**************') 238 | # # print('5min',norm2_WLS_VM[0]) 239 | # # print('1h',np.sum(norm2_WLS_VM[0:12])/12) 240 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 241 | # 242 | # 243 | # ind = np.arange(len(h_dnn_msr_rmse)) 244 | # rects1 = p1.bar(ind, h_dnn_msr_rmse, width, color='r') 245 | # rects2 = p1.bar(ind + width, h_wls_msr_rmse, width, color='b') 246 | # p1.set_ylabel('RMSE', font2) 247 | # p1.set_title('Measurement RMSE in IEEE14', font2) 248 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 249 | # # plt.plot(ind, dnn_msr_rmse, ind, wls_msr_rmse) 250 | # 251 | # plt.show() 252 | # 253 | # ''' 254 | 255 | 256 | import pandas as pd 257 | import matplotlib.pyplot as plt 258 | import numpy as np 259 | from numpy import linalg as LA 260 | from matplotlib.patches import ConnectionPatch 261 | import xlwt 262 | 263 | # # 设置图例并且设置图例的字体及大小 264 | font1 = {'family': 'Times New Roman', 265 | 'weight': 'normal', 266 | 'size': 18, 267 | } 268 | 269 | font2 = {'family': 'Times New Roman', 270 | 'weight': 'normal', 271 | 'size': 20, 272 | } 273 | 274 | wls = pd.read_excel('./Results/wls.xlsx', sheetname='Sheet1', header=None) 275 | wls = wls.as_matrix() 276 | mask = np.where(np.isnan(wls[:, 0]))[0] 277 | wls = np.delete(wls, mask, axis=0) 278 | 279 | 280 | wls_angle = wls[:, 0:13] 281 | wls_voltage = wls[:, 13:] 282 | 283 | dnn = pd.read_excel('./Results/dnn-test-total.xls', sheetname='Sheet1', header=None) 284 | dnn = dnn.as_matrix() 285 | dnn = np.delete(dnn, mask, axis=0) 286 | 287 | 288 | # sys_data = sys_data.T 289 | dnn_angle = dnn[:, 0:13] 290 | dnn_voltage = dnn[:, 13:] 291 | 292 | real = pd.read_excel('./Results/real.xlsx', sheetname='Sheet1', header=None) 293 | real = real.as_matrix() 294 | real = np.delete(real, mask, axis=0) 295 | 296 | real_angle = real[:, 0:13] 297 | real_voltage = real[:, 13:] 298 | 299 | wls_real_angle = (wls_angle - real_angle) ** 2 300 | wls_real_voltage = (wls_voltage - real_voltage) ** 2 301 | 302 | dnn_real_angle = (dnn_angle - real_angle) ** 2 303 | dnn_real_voltage = (dnn_voltage - real_voltage) ** 2 304 | norm2_DNN_VA = 1 / dnn_real_angle.shape[1] * np.sqrt(np.sum(dnn_real_angle, axis=1)) 305 | norm2_WLS_VA = 1 / wls_real_angle.shape[1] * np.sqrt(np.sum(wls_real_angle, axis=1)) 306 | mask1 = np.where(norm2_WLS_VA > 0.05) 307 | norm2_DNN_VM = 1 / dnn_real_voltage.shape[1] * np.sqrt(np.sum(dnn_real_voltage, axis=1)) 308 | norm2_WLS_VM = 1 / wls_real_voltage.shape[1] * np.sqrt(np.sum(wls_real_voltage, axis=1)) 309 | mask2 = np.where(norm2_WLS_VM > 0.02) 310 | mask3 = np.hstack((mask1, mask2)) 311 | mask3 = np.unique(mask3) 312 | 313 | norm2_DNN_VA = np.delete(norm2_DNN_VA, mask3, axis=0) 314 | norm2_WLS_VA = np.delete(norm2_WLS_VA, mask3, axis=0) 315 | norm2_DNN_VM = np.delete(norm2_DNN_VM, mask3, axis=0) 316 | norm2_WLS_VM = np.delete(norm2_WLS_VM, mask3, axis=0) 317 | 318 | norm2_DNN_VA = norm2_DNN_VA[-288:] 319 | norm2_WLS_VA = norm2_WLS_VA[-288:] 320 | norm2_DNN_VM = norm2_DNN_VM[-288:] 321 | norm2_WLS_VM = norm2_WLS_VM[-288:] 322 | 323 | 324 | print(len(norm2_DNN_VA)) 325 | 326 | h_norm2_DNN_VA = [] 327 | for i in range(len(norm2_DNN_VA)): 328 | if (i + 1) % 12 == 0: 329 | tmp = np.sum(norm2_DNN_VA[i + 1 - 12:i + 1]) 330 | h_norm2_DNN_VA.append(1 / 12 * tmp) 331 | print(i) 332 | elif (len(norm2_DNN_VA) - i) < 12: 333 | tmp = np.sum(norm2_DNN_VA[i: len(norm2_DNN_VA)]) 334 | h_norm2_DNN_VA.append(1 / (len(norm2_WLS_VM) - i) * tmp) 335 | break 336 | h_norm2_DNN_VA = np.array(h_norm2_DNN_VA) 337 | h_norm2_DNN_VA = h_norm2_DNN_VA.squeeze() 338 | 339 | h_norm2_WLS_VA = [] 340 | for i in range(len(norm2_WLS_VA)): 341 | if (i + 1) % 12 == 0: 342 | tmp = np.sum(norm2_WLS_VA[i + 1 - 12:i + 1]) 343 | h_norm2_WLS_VA.append(1 / 12 * tmp) 344 | elif (len(norm2_WLS_VA) - i - 1) < 12: 345 | tmp = np.sum(norm2_WLS_VA[i: len(norm2_WLS_VA)]) 346 | h_norm2_WLS_VA.append(1 / (len(norm2_WLS_VA) - i) * tmp) 347 | break 348 | h_norm2_WLS_VA = np.array(h_norm2_WLS_VA) 349 | h_norm2_WLS_VA = h_norm2_WLS_VA.squeeze() 350 | 351 | h_norm2_DNN_VM = [] 352 | for i in range(len(norm2_DNN_VM)): 353 | if (i + 1) % 12 == 0: 354 | tmp = np.sum(norm2_DNN_VM[i + 1 - 12:i + 1]) 355 | h_norm2_DNN_VM.append(1 / 12 * tmp) 356 | elif (len(norm2_DNN_VM) - i - 1) < 12: 357 | tmp = np.sum(norm2_DNN_VM[i: len(norm2_DNN_VM)]) 358 | h_norm2_DNN_VM.append(1 / (len(norm2_DNN_VM) - i) * tmp) 359 | break 360 | h_norm2_DNN_VM = np.array(h_norm2_DNN_VM) 361 | h_norm2_DNN_VM = h_norm2_DNN_VM.squeeze() 362 | 363 | h_norm2_WLS_VM = [] 364 | for i in range(len(norm2_WLS_VM)): 365 | if (i + 1) % 12 == 0: 366 | tmp = np.sum(norm2_WLS_VM[i + 1 - 12:i + 1]) 367 | h_norm2_WLS_VM.append(1 / 12 * tmp) 368 | elif (len(norm2_WLS_VM) - i - 1) < 12: 369 | tmp = np.sum(norm2_WLS_VM[i: len(norm2_WLS_VM)]) 370 | h_norm2_WLS_VM.append(1 / (len(norm2_WLS_VM) - i) * tmp) 371 | break 372 | h_norm2_WLS_VM = np.array(h_norm2_WLS_VM) 373 | h_norm2_WLS_VM = h_norm2_WLS_VM.squeeze() 374 | 375 | print('*****************DNN**************') 376 | print('5min', norm2_DNN_VA[0]) 377 | print('1h', np.sum(norm2_DNN_VA[0:12]) / 12) 378 | print('one day', np.sum(norm2_DNN_VA) / len(norm2_DNN_VA)) 379 | print('*****************WLS**************') 380 | print('5min', norm2_WLS_VA[0]) 381 | print('1h', np.sum(norm2_WLS_VA[0:12]) / 12) 382 | print('one day', np.sum(norm2_WLS_VA) / len(norm2_WLS_VA)) 383 | 384 | print('*****************DNN**************') 385 | print('5min', norm2_DNN_VM[0]) 386 | print('1h', np.sum(norm2_DNN_VM[0:12]) / 12) 387 | print('one day', np.sum(norm2_DNN_VM) / len(norm2_DNN_VM)) 388 | 389 | print('*****************WLS**************') 390 | print('5min', norm2_WLS_VM[0]) 391 | print('1h', np.sum(norm2_WLS_VM[0:12]) / 12) 392 | print('one day', np.sum(norm2_WLS_VM) / 280) 393 | 394 | # print(np.sum(norm2_WLS_VA)) 395 | plt.figure() 396 | p2 = plt.subplot() 397 | # p2 = plt.subplot(122) 398 | width = 0.3 399 | 400 | 401 | # ind = np.arange(len(h_norm2_DNN_VA)) 402 | # # fig, ax = plt.subplots() 403 | # rects1 = p1.bar(ind, h_norm2_DNN_VA, width, color='r') 404 | # rects2 = p1.bar(ind + width, h_norm2_WLS_VA, width, color='b') 405 | # # add some text for labels, title and axes ticks 406 | # p1.set_ylabel('THRMSE', font2) 407 | # p1.set_title('IEEE14 voltage angles',font2) 408 | # # ax.set_xticks(ind + width / 2) 409 | # 410 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 411 | 412 | ind = np.arange(len(norm2_DNN_VM)) 413 | rects3 = p2.bar(ind, norm2_DNN_VM, width, color='r') 414 | rects4 = p2.bar(ind + width, norm2_WLS_VM, width, color='b') 415 | # add some text for labels, title and axes ticks 416 | p2.set_ylabel('THRMSE', font2) 417 | p2.set_title('IEEE14 voltage magnitudes', font2) 418 | p2.legend((rects3[0], rects4[0]), ('DNN', 'WLS')) 419 | 420 | 421 | plt.tick_params(labelsize=15) 422 | plt.show() 423 | 424 | -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/IEEE14.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | import math 4 | 5 | import numpy as np 6 | import pandas as pd 7 | import torch 8 | import torch.nn as nn 9 | import torch.nn.functional as F 10 | import torch.nn.init as init 11 | import torch.utils.data as Data 12 | import xlwt 13 | from torch.autograd import Variable 14 | from tqdm import trange 15 | 16 | from cyclic_lr_scheduler import CyclicLR 17 | 18 | use_cuda = torch.cuda.is_available() 19 | device = torch.device("cuda:0" if use_cuda else "cpu") 20 | print(torch.cuda.get_device_name(torch.cuda.current_device())) 21 | 22 | xls = pd.ExcelFile('measurements.xlsx') 23 | sys_data = pd.read_excel(xls, sheetname='Data', header=None) 24 | sys_data = sys_data.as_matrix() 25 | 26 | G = pd.read_excel(xls, sheetname='Real', header=None) 27 | G = G.as_matrix() 28 | # Imag part 29 | imag = pd.read_excel(xls, sheetname='Imag', header=None) 30 | B = imag.as_matrix() 31 | 32 | # According to the data frame (np. ndarray) 33 | m_type = sys_data[1] # type of the measurements 34 | FB = sys_data[2] # from bus 35 | TB = sys_data[3] # to bus 36 | R = sys_data[4] # covariance 37 | 38 | vi = np.argwhere(m_type == 1) # Type1: V 39 | Vmask = FB[vi] - 1 40 | ppi = np.argwhere(m_type == 2).squeeze() # Type2: Pi 41 | BP_mask = Variable(torch.from_numpy(FB[ppi] - 1).long()).squeeze().to(device) 42 | qi = np.argwhere(m_type == 3).squeeze() # Type3: Qi 43 | BQ_mask = Variable(torch.from_numpy(FB[qi] - 1).long()).squeeze().to(device) 44 | ppf = np.argwhere(m_type == 4).squeeze() # Type4: Pij 45 | PF_FR = Variable(torch.from_numpy(FB[ppf] - 1).long()).squeeze().to(device) 46 | PF_TO = Variable(torch.from_numpy(TB[ppf] - 1).long()).squeeze().to(device) 47 | qf = np.argwhere(m_type == 5).squeeze() # Type5: Qij 48 | QF_FR = Variable(torch.from_numpy(FB[qf] - 1).long()).squeeze().to(device) 49 | QF_TO = Variable(torch.from_numpy(TB[qf] - 1).long()).squeeze().to(device) 50 | 51 | nvi = len(vi) 52 | npi = len(ppi) 53 | nqi = len(qi) 54 | npf = len(ppf) 55 | nqf = len(qf) 56 | 57 | # Load features of the measurements 58 | nBus = 14 # Bus # of targeted system 59 | M = sys_data.shape[1] # Measurements # 60 | nSet = sys_data.shape[0] # Sets # of sys_data 61 | N = 2 * nBus - 1 # State variables # 62 | ref_ang = 0 * math.pi / 180 # reference bus angle 63 | 64 | # Use Variable container 65 | G = Variable(torch.from_numpy(G).float()).to(device) 66 | B = Variable(torch.from_numpy(B).float()).to(device) 67 | 68 | # Mini-batch DataLoader 69 | # Hyper parameters 70 | BATCH_SIZE = 32 71 | LR = 1e-3 72 | EPOCH = 500 73 | 74 | sys_data1 = torch.from_numpy(sys_data[5:]).float() 75 | iter_size = len(sys_data1) // BATCH_SIZE 76 | torch_dataset1 = Data.TensorDataset(sys_data1, sys_data1) 77 | loader1 = Data.DataLoader(dataset=torch_dataset1, # torch TensorDataset format 78 | batch_size=BATCH_SIZE, # mini batch size 79 | shuffle=False, # random shuffle for training 80 | num_workers=2, # sub-processes for loading data 81 | drop_last=True, ) 82 | 83 | sys_data2 = torch.from_numpy(sys_data[5:869]).float() 84 | 85 | true_data = pd.read_excel(xls, sheetname='WLS_Train', header=None) 86 | true_data = true_data.as_matrix() 87 | true_data = torch.from_numpy(true_data[:864]).float() 88 | 89 | torch_dataset2 = Data.TensorDataset(sys_data2, true_data) 90 | loader2 = Data.DataLoader(dataset=torch_dataset2, # torch TensorDataset format 91 | batch_size=BATCH_SIZE, # mini batch size 92 | shuffle=False, # random shuffle for training 93 | num_workers=2, # sub-processes for loading data 94 | drop_last=True, ) 95 | 96 | 97 | # Build up the NN module 98 | class Net(torch.nn.Module): 99 | def __init__(self): 100 | super(Net, self).__init__() 101 | self.hidden1 = torch.nn.Linear(M, 128) 102 | self.hidden2 = torch.nn.Linear(128, 128) 103 | self.hidden3 = torch.nn.Linear(128, 64) 104 | self.output = torch.nn.Linear(64, N) 105 | 106 | def forward(self, x): 107 | x = torch.sigmoid(self.hidden1(x)) 108 | x = torch.sigmoid(self.hidden2(x)) # replace sigmoid(), cz it is too slow here 109 | x = torch.sigmoid(self.hidden3(x)) 110 | x = self.output(x) 111 | return x 112 | 113 | 114 | def weight_init(m): 115 | ''' 116 | Usage: 117 | model = Model() 118 | model.apply(weight_init) 119 | ''' 120 | if isinstance(m, nn.Conv1d): 121 | init.normal_(m.weight.data) 122 | if m.bias is not None: 123 | init.normal_(m.bias.data) 124 | elif isinstance(m, nn.Conv2d): 125 | init.xavier_normal_(m.weight.data) 126 | if m.bias is not None: 127 | init.normal_(m.bias.data) 128 | elif isinstance(m, nn.Conv3d): 129 | init.xavier_normal_(m.weight.data) 130 | if m.bias is not None: 131 | init.normal_(m.bias.data) 132 | elif isinstance(m, nn.ConvTranspose1d): 133 | init.normal_(m.weight.data) 134 | if m.bias is not None: 135 | init.normal_(m.bias.data) 136 | elif isinstance(m, nn.ConvTranspose2d): 137 | init.xavier_normal_(m.weight.data) 138 | if m.bias is not None: 139 | init.normal_(m.bias.data) 140 | elif isinstance(m, nn.ConvTranspose3d): 141 | init.xavier_normal_(m.weight.data) 142 | if m.bias is not None: 143 | init.normal_(m.bias.data) 144 | elif isinstance(m, nn.BatchNorm1d): 145 | init.normal_(m.weight.data, mean=1, std=0.02) 146 | init.constant_(m.bias.data, 0) 147 | elif isinstance(m, nn.BatchNorm2d): 148 | init.normal_(m.weight.data, mean=1, std=0.02) 149 | init.constant_(m.bias.data, 0) 150 | elif isinstance(m, nn.BatchNorm3d): 151 | init.normal_(m.weight.data, mean=1, std=0.02) 152 | init.constant_(m.bias.data, 0) 153 | elif isinstance(m, nn.Linear): 154 | init.xavier_normal_(m.weight.data) 155 | init.normal_(m.bias.data) 156 | elif isinstance(m, nn.LSTM): 157 | for param in m.parameters(): 158 | if len(param.shape) >= 2: 159 | init.orthogonal_(param.data) 160 | else: 161 | init.normal_(param.data) 162 | elif isinstance(m, nn.LSTMCell): 163 | for param in m.parameters(): 164 | if len(param.shape) >= 2: 165 | init.orthogonal_(param.data) 166 | else: 167 | init.normal_(param.data) 168 | elif isinstance(m, nn.GRU): 169 | for param in m.parameters(): 170 | if len(param.shape) >= 2: 171 | init.orthogonal_(param.data) 172 | else: 173 | init.normal_(param.data) 174 | elif isinstance(m, nn.GRUCell): 175 | for param in m.parameters(): 176 | if len(param.shape) >= 2: 177 | init.orthogonal_(param.data) 178 | else: 179 | init.normal_(param.data) 180 | 181 | 182 | # Reload the module after initialization 183 | estimator = Net() 184 | estimator.to(device) 185 | print(estimator) 186 | optimizer = torch.optim.Adam(estimator.parameters(), lr=LR, betas=(0.9, 0.9)) 187 | loss_func = torch.nn.MSELoss(reduction='mean').to(device) 188 | l2 = torch.nn.MSELoss(reduction='sum').to(device) 189 | 190 | # Power Injection 191 | GP = G[BP_mask] 192 | BP = B[BP_mask] 193 | GQ = G[BQ_mask] 194 | BQ = B[BQ_mask] 195 | # Power Flow 196 | GPF = G[PF_FR, PF_TO].unsqueeze(1) 197 | BPF = B[PF_FR, PF_TO].unsqueeze(1) 198 | GQF = G[QF_FR, QF_TO].unsqueeze(1) 199 | BQF = B[QF_FR, QF_TO].unsqueeze(1) 200 | 201 | 202 | def power_flow(outputs): 203 | # outputs = outputs.squeeze(0).permute(1, 0) 204 | outputs = outputs.permute(1, 0) 205 | Z_hat = Variable(torch.zeros(M, 1)).to(device) 206 | A = Variable(ref_ang * torch.ones(nBus, 1)).to(device) 207 | A[1:nBus] = outputs[0:nBus - 1] # Reference Bus #1 208 | V = outputs[nBus - 1:] # voltage magnitude 209 | 210 | ## V 211 | Z_hat[vi, :] = V[Vmask] 212 | 213 | ## Pi 214 | VP_FR = V[BP_mask].repeat(1, nBus) 215 | VP_TO = V.repeat(1, nBus).permute(1, 0)[BP_mask] 216 | 217 | AP_FR = A[BP_mask].repeat(1, nBus) 218 | AP_TO = A.repeat(1, nBus).permute(1, 0)[BP_mask] 219 | 220 | temp = VP_FR * VP_TO * (GP * torch.cos(AP_FR - AP_TO) + BP * torch.sin(AP_FR - AP_TO)) 221 | Z_hat[ppi, :] = torch.sum(temp, 1, keepdim=True) 222 | 223 | ## Qi 224 | VQ_FR = V[BQ_mask].repeat(1, nBus) 225 | VQ_TO = V.repeat(1, nBus).permute(1, 0)[BQ_mask] 226 | 227 | AQ_FR = A[BQ_mask].repeat(1, nBus) 228 | AQ_TO = A.repeat(1, nBus).permute(1, 0)[BQ_mask] 229 | 230 | temp = VQ_FR * VQ_TO * (GQ * torch.sin(AQ_FR - AQ_TO) - BQ * torch.cos(AQ_FR - AQ_TO)) 231 | Z_hat[qi, :] = torch.sum(temp, 1, keepdim=True) 232 | 233 | ## Pij 234 | Z_hat[ppf, :] = -V[PF_FR] * V[PF_FR] * GPF - V[PF_FR] * V[PF_TO] * ( 235 | -GPF * torch.cos(A[PF_FR] - A[PF_TO]) - BPF * torch.sin(A[PF_FR] - A[PF_TO])) 236 | 237 | # Qij 238 | Z_hat[qf, :] = V[QF_FR] * V[QF_FR] * BQF - V[QF_FR] * V[QF_TO] * ( 239 | -GQF * torch.sin(A[QF_FR] - A[QF_TO]) + BQF * torch.cos(A[QF_FR] - A[QF_TO])) 240 | 241 | # return Z_hat.permute(1, 0) 242 | return Z_hat.squeeze() 243 | 244 | 245 | ######################################## 246 | ##Batchsize, Build up 3D operation 247 | ######################################## 248 | # Power Injection 249 | B_GP = G[BP_mask].repeat(BATCH_SIZE, 1, 1) 250 | B_BP = B[BP_mask].repeat(BATCH_SIZE, 1, 1) 251 | B_GQ = G[BQ_mask].repeat(BATCH_SIZE, 1, 1) 252 | B_BQ = B[BQ_mask].repeat(BATCH_SIZE, 1, 1) 253 | # Power Flow 254 | B_GPF = G[PF_FR, PF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 255 | B_BPF = B[PF_FR, PF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 256 | B_GQF = G[QF_FR, QF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 257 | B_BQF = B[QF_FR, QF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 258 | 259 | 260 | def power_flow_batch(outputs): 261 | outputs = outputs.permute(1, 2, 0) 262 | Z_hat = Variable(torch.zeros(BATCH_SIZE, M, 1)).to(device) 263 | A = Variable(ref_ang * torch.ones(BATCH_SIZE, nBus, 1)).to(device) 264 | A[:, 1:nBus] = outputs[:, 0:nBus - 1] # voltage angle 265 | V = outputs[:, nBus - 1:] # voltage magnitude 266 | ## V 267 | Z_hat[:, vi, :] = V[:, Vmask, :] 268 | ## Pi 269 | B_VP_FR = V[:, BP_mask].repeat(1, 1, nBus) 270 | B_VP_TO = V.repeat(1, 1, nBus).permute(0, 2, 1)[:, BP_mask] 271 | 272 | B_AP_FR = A[:, BP_mask].repeat(1, 1, nBus) 273 | B_AP_TO = A.repeat(1, 1, nBus).permute(0, 2, 1)[:, BP_mask] 274 | 275 | temp = B_VP_FR * B_VP_TO * (B_GP * torch.cos(B_AP_FR - B_AP_TO) + B_BP * torch.sin(B_AP_FR - B_AP_TO)) 276 | Z_hat[:, ppi, :] = torch.sum(temp, 2, keepdim=True) 277 | 278 | ## Qi 279 | B_VQ_FR = V[:, BQ_mask].repeat(1, 1, nBus) 280 | B_VQ_TO = V.repeat(1, 1, nBus).permute(0, 2, 1)[:, BQ_mask] 281 | 282 | B_AQ_FR = A[:, BQ_mask].repeat(1, 1, nBus) 283 | B_AQ_TO = A.repeat(1, 1, nBus).permute(0, 2, 1)[:, BQ_mask] 284 | 285 | temp = B_VQ_FR * B_VQ_TO * (B_GQ * torch.sin(B_AQ_FR - B_AQ_TO) - B_BQ * torch.cos(B_AQ_FR - B_AQ_TO)) 286 | Z_hat[:, qi, :] = torch.sum(temp, 2, keepdim=True) 287 | ## Pij 288 | Z_hat[:, ppf, :] = -V[:, PF_FR] * V[:, PF_FR] * B_GPF - V[:, PF_FR] * V[:, PF_TO] * ( 289 | -B_GPF * torch.cos(A[:, PF_FR] - A[:, PF_TO]) - B_BPF * torch.sin(A[:, PF_FR] - A[:, PF_TO])) 290 | 291 | # Qij 292 | Z_hat[:, qf, :] = V[:, QF_FR] * V[:, QF_FR] * B_BQF - V[:, QF_FR] * V[:, QF_TO] * ( 293 | -B_GQF * torch.sin(A[:, QF_FR] - A[:, QF_TO]) + B_BQF * torch.cos(A[:, QF_FR] - A[:, QF_TO])) 294 | 295 | return Z_hat.squeeze(2) 296 | 297 | 298 | def batch_train_params(): 299 | print('Start Initializing...') 300 | estimator.apply(weight_init) 301 | # scheduler = CyclicLR(optimizer, base_lr=1e-7, max_lr=1e-3, step_size=300, mode='triangular') 302 | with trange(0, 250) as numEpoch: 303 | 304 | for epoch in numEpoch: 305 | # total_loss = 0 306 | # scheduler.step() 307 | # optimizer.zero_grad() 308 | for step, (batch_train, batch_target) in enumerate(loader2): 309 | inputs = batch_train.view((1, batch_train.shape[0], batch_train.shape[1])).to(device).requires_grad_() 310 | targets = batch_target.to(device) 311 | 312 | outputs = estimator(inputs) 313 | outputs = outputs.squeeze() 314 | optimizer.zero_grad() 315 | loss = loss_func(outputs, targets) 316 | loss.backward() 317 | optimizer.step() 318 | numEpoch.set_postfix(Loss='%0.8f' % loss) 319 | torch.save(estimator.state_dict(), 'initial_batch_params.pkl') 320 | 321 | 322 | def train(): 323 | print('Start Training...') 324 | estimator.load_state_dict(torch.load('initial_batch_params.pkl')) 325 | scheduler = CyclicLR(optimizer, base_lr=1e-7, max_lr=1e-4, step_size=300, mode='triangular') 326 | 327 | with trange(0, EPOCH) as numEPoch: 328 | for epoch in numEPoch: 329 | total_loss = 0 330 | scheduler.step() 331 | optimizer.zero_grad() 332 | for step, (batch_train, batch_targets) in enumerate(loader1): 333 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 334 | inputs = Variable(batch_train, requires_grad=True).to(device) 335 | targets = Variable(batch_targets).to(device) 336 | 337 | outputs = estimator(inputs) 338 | Z_hat = power_flow_batch(outputs) 339 | loss = loss_func(Z_hat, targets) / iter_size 340 | loss.backward() 341 | total_loss += loss 342 | optimizer.step() 343 | numEPoch.set_postfix(Loss='%0.8f' % total_loss) # print error 344 | torch.save(estimator.state_dict(), 'final_params.pkl') 345 | 346 | 347 | # Load streaming data 348 | stream_data = pd.read_excel(xls, sheetname='TestData', header=None) 349 | stream_data = stream_data.as_matrix() 350 | # stream_data = stream_data.T 351 | stream_data = torch.from_numpy(stream_data).float() 352 | stream_torch_dataset = Data.TensorDataset(stream_data, stream_data) 353 | stream_loader = Data.DataLoader(dataset=stream_torch_dataset, batch_size=1, shuffle=False, 354 | # random shuffle for training 355 | num_workers=2, # sub-processes for loading data 356 | ) 357 | 358 | 359 | def pfm_test(): 360 | estimator.load_state_dict(torch.load('final_params.pkl')) 361 | for param_group in optimizer.param_groups: 362 | param_group['lr'] = 1e-8 363 | print('Online Training...') 364 | file = xlwt.Workbook() 365 | # his_loss = [] 366 | for step, (batch_train, batch_targets) in enumerate(stream_loader): 367 | batch_train = batch_train.view(batch_train.shape[0], batch_train.shape[1]) 368 | inputs = Variable(batch_train, requires_grad=True).to(device) 369 | targets = Variable(batch_targets).to(device) 370 | 371 | outputs = estimator(inputs) 372 | Z_hat = power_flow(outputs) 373 | loss = loss_func(Z_hat, targets) 374 | 375 | if loss < 5e-4: 376 | optimizer.zero_grad() 377 | loss.backward() 378 | optimizer.step() 379 | 380 | outputs = outputs.squeeze() 381 | if step > 16261: 382 | sheet = file.add_sheet(str(step), cell_overwrite_ok=True) 383 | for j in range(len(outputs)): 384 | sheet.write(j, 0, outputs[j].item()) 385 | ffilename = 'dnn-test.xls' 386 | file.save(ffilename) 387 | 388 | 389 | def main(): 390 | batch_train_params() 391 | train() 392 | pfm_test() 393 | 394 | 395 | if __name__ == "__main__": 396 | main() 397 | -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/Readme: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/cyclic_lr_scheduler.py: -------------------------------------------------------------------------------- 1 | import math 2 | import numpy as np 3 | from torch.optim.optimizer import Optimizer 4 | 5 | 6 | class _LRScheduler(object): 7 | def __init__(self, optimizer, last_epoch=-1): 8 | if not isinstance(optimizer, Optimizer): 9 | raise TypeError('{} is not an Optimizer'.format( 10 | type(optimizer).__name__)) 11 | self.optimizer = optimizer 12 | if last_epoch == -1: 13 | for group in optimizer.param_groups: 14 | group.setdefault('initial_lr', group['lr']) 15 | else: 16 | for i, group in enumerate(optimizer.param_groups): 17 | if 'initial_lr' not in group: 18 | raise KeyError("param 'initial_lr' is not specified " 19 | "in param_groups[{}] when resuming an optimizer".format(i)) 20 | self.base_lrs = list(map(lambda group: group['initial_lr'], optimizer.param_groups)) 21 | self.step(last_epoch + 1) 22 | self.last_epoch = last_epoch 23 | 24 | def get_lr(self): 25 | raise NotImplementedError 26 | 27 | def step(self, epoch=None): 28 | if epoch is None: 29 | epoch = self.last_epoch + 1 30 | self.last_epoch = epoch 31 | for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): 32 | param_group['lr'] = lr 33 | 34 | 35 | class CyclicLR(_LRScheduler): 36 | 37 | def __init__(self, optimizer, base_lr, max_lr, step_size, gamma=0.99, mode='triangular', last_epoch=-1): 38 | self.optimizer = optimizer 39 | self.base_lr = base_lr 40 | self.max_lr = max_lr 41 | self.step_size = step_size 42 | self.gamma = gamma 43 | self.mode = mode 44 | assert mode in ['triangular', 'triangular2', 'exp_range'] 45 | super(CyclicLR, self).__init__(optimizer, last_epoch) 46 | 47 | def get_lr(self): 48 | new_lr = [] 49 | # make sure that the length of base_lrs doesn't change. Dont care about the actual value 50 | for base_lr in self.base_lrs: 51 | cycle = np.floor(1 + self.last_epoch / (2 * self.step_size)) 52 | x = np.abs(float(self.last_epoch) / self.step_size - 2 * cycle + 1) 53 | if self.mode == 'triangular': 54 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) 55 | elif self.mode == 'triangular2': 56 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) / float(2 ** (cycle - 1)) 57 | elif self.mode == 'exp_range': 58 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) * (self.gamma ** ( 59 | self.last_epoch)) 60 | new_lr.append(lr) 61 | return new_lr -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/dnn-test.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE14/dnn-test.xls -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/ffnn.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE14/ffnn.xls -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/final_params.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE14/final_params.pkl -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/initial_batch_params.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE14/initial_batch_params.pkl -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/integratedata.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import xlwt 4 | 5 | xls = pd.ExcelFile('dnn-test.xls') 6 | total = np.zeros(27) 7 | for i in range(16262, 17133): 8 | sys_data = pd.read_excel(xls, sheetname=str(i), header=None) 9 | sys_data = sys_data.squeeze() 10 | # sys_data = sys_data.as_matrix() 11 | # print(total.shape) 12 | # print(sys_data.shape) 13 | total = np.vstack((total, sys_data)) 14 | total = total[1:,:] 15 | _r, _c = total.shape 16 | file = xlwt.Workbook() 17 | sheet = file.add_sheet('Sheet1') 18 | for r in range(_r): 19 | for c in range(_c): 20 | sheet.write(r, c, total[r, c]) 21 | file.save('ffnn.xls') 22 | 23 | -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/IEEE14/measurements.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/FeedForwardNeuralNetwork/IEEE14/measurements.xlsx -------------------------------------------------------------------------------- /FeedForwardNeuralNetwork/ReadMe: -------------------------------------------------------------------------------- 1 | To save time, the saved network parameters are available. 2 | -------------------------------------------------------------------------------- /LSTM/IEEE118/IEEE118.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | import math 4 | import time 5 | 6 | import matplotlib.pyplot as plt 7 | import numpy as np 8 | import pandas as pd 9 | import torch 10 | import torch.nn as nn 11 | import torch.nn.functional as F 12 | import torch.utils.data as Data 13 | import xlrd 14 | import xlwt 15 | from torch.autograd import Variable 16 | from tqdm import tqdm 17 | from tqdm import trange 18 | from cyclic_lr_scheduler import CyclicLR 19 | import torch.nn.init as init 20 | 21 | 22 | use_cuda = torch.cuda.is_available() 23 | device = torch.device("cuda:0" if use_cuda else "cpu") 24 | print(torch.cuda.get_device_name(torch.cuda.current_device())) 25 | 26 | xls = pd.ExcelFile('measurements.xlsx') 27 | sys_data = pd.read_excel(xls, sheetname='Data', header=None) 28 | sys_data = sys_data.as_matrix() 29 | 30 | G = pd.read_excel(xls, sheetname='Real', header=None) 31 | G = G.as_matrix() 32 | # Imag part 33 | imag = pd.read_excel(xls, sheetname='Imag', header=None) 34 | B = imag.as_matrix() 35 | 36 | # According to the data frame (np. ndarray) 37 | m_type = sys_data[1] # type of the measurements 38 | FB = sys_data[2] # from bus 39 | TB = sys_data[3] # to bus 40 | R = sys_data[4] # covariance 41 | 42 | vi = np.argwhere(m_type == 1) # Type1: V 43 | Vmask = FB[vi] - 1 44 | ppi = np.argwhere(m_type == 2).squeeze() # Type2: Pi 45 | BP_mask = Variable(torch.from_numpy(FB[ppi] - 1).long()).squeeze().to(device) 46 | qi = np.argwhere(m_type == 3).squeeze() # Type3: Qi 47 | BQ_mask = Variable(torch.from_numpy(FB[qi] - 1).long()).squeeze().to(device) 48 | ppf = np.argwhere(m_type == 4).squeeze() # Type4: Pij 49 | PF_FR = Variable(torch.from_numpy(FB[ppf] - 1).long()).squeeze().to(device) 50 | PF_TO = Variable(torch.from_numpy(TB[ppf] - 1).long()).squeeze().to(device) 51 | qf = np.argwhere(m_type == 5).squeeze() # Type5: Qij 52 | QF_FR = Variable(torch.from_numpy(FB[qf] - 1).long()).squeeze().to(device) 53 | QF_TO = Variable(torch.from_numpy(TB[qf] - 1).long()).squeeze().to(device) 54 | 55 | nvi = len(vi) 56 | npi = len(ppi) 57 | nqi = len(qi) 58 | npf = len(ppf) 59 | nqf = len(qf) 60 | 61 | # Load features of the measurements 62 | nBus = 118 # Bus # of targeted system 63 | M = sys_data.shape[1] # Measurements # 64 | nSet = sys_data.shape[0] # Sets # of sys_data 65 | N = 2 * nBus - 1 # State variables # 66 | ref_ang = 30 * math.pi / 180 # reference bus angle 67 | 68 | # Use Variable container 69 | G = Variable(torch.from_numpy(G).float()).to(device) 70 | B = Variable(torch.from_numpy(B).float()).to(device) 71 | 72 | # Mini-batch DataLoader 73 | # Hyper parameters 74 | BATCH_SIZE = 32 75 | LR = 1e-3 76 | EPOCH = 100 77 | 78 | sys_data1 = torch.from_numpy(sys_data[5:]).float() 79 | 80 | torch_dataset1 = Data.TensorDataset(sys_data1, sys_data1) 81 | loader1 = Data.DataLoader(dataset=torch_dataset1, # torch TensorDataset format 82 | batch_size=BATCH_SIZE, # mini batch size 83 | shuffle=False, # random shuffle for training 84 | num_workers=2, # sub-processes for loading data 85 | drop_last=True, 86 | ) 87 | 88 | 89 | sys_data2 = torch.from_numpy(sys_data[5:]).float() 90 | 91 | true_data = pd.read_excel(xls, sheetname='WLS_Train', header=None) 92 | true_data = true_data.as_matrix() 93 | true_data = torch.from_numpy(true_data).float() 94 | 95 | torch_dataset2 = Data.TensorDataset(sys_data2, true_data) 96 | loader2 = Data.DataLoader(dataset=torch_dataset2, # torch TensorDataset format 97 | batch_size=BATCH_SIZE, # mini batch size 98 | shuffle=False, # random shuffle for training 99 | num_workers=2, # sub-processes for loading data 100 | drop_last=True, 101 | ) 102 | 103 | 104 | 105 | # Build up the NN module 106 | class Net(torch.nn.Module): 107 | def __init__(self): 108 | super(Net, self).__init__() 109 | self.hidden1 = nn.Linear(M, 512) 110 | self.lstm = nn.LSTM(input_size=512, 111 | hidden_size=512, 112 | num_layers=2, 113 | batch_first=False, 114 | ) 115 | self.out = nn.Linear(512, N) 116 | 117 | def forward(self, inputs, hidden): 118 | layer1 = torch.tanh(self.hidden1(inputs)) 119 | r_out, hidden = self.lstm(layer1, hidden) 120 | outputs = self.out(r_out[-1, :, :]) 121 | return outputs, hidden 122 | 123 | 124 | def repackage_hidden(h): 125 | "Wraps hidden states in new Tensors, to detach them from their history." 126 | if h is None: 127 | return h 128 | return [state.detach() for state in h] 129 | 130 | 131 | def weight_init(m): 132 | ''' 133 | Usage: 134 | model = Model() 135 | model.apply(weight_init) 136 | ''' 137 | if isinstance(m, nn.Conv1d): 138 | init.normal_(m.weight.data) 139 | if m.bias is not None: 140 | init.normal_(m.bias.data) 141 | elif isinstance(m, nn.Conv2d): 142 | init.xavier_normal_(m.weight.data) 143 | if m.bias is not None: 144 | init.normal_(m.bias.data) 145 | elif isinstance(m, nn.Conv3d): 146 | init.xavier_normal_(m.weight.data) 147 | if m.bias is not None: 148 | init.normal_(m.bias.data) 149 | elif isinstance(m, nn.ConvTranspose1d): 150 | init.normal_(m.weight.data) 151 | if m.bias is not None: 152 | init.normal_(m.bias.data) 153 | elif isinstance(m, nn.ConvTranspose2d): 154 | init.xavier_normal_(m.weight.data) 155 | if m.bias is not None: 156 | init.normal_(m.bias.data) 157 | elif isinstance(m, nn.ConvTranspose3d): 158 | init.xavier_normal_(m.weight.data) 159 | if m.bias is not None: 160 | init.normal_(m.bias.data) 161 | elif isinstance(m, nn.BatchNorm1d): 162 | init.normal_(m.weight.data, mean=1, std=0.02) 163 | init.constant_(m.bias.data, 0) 164 | elif isinstance(m, nn.BatchNorm2d): 165 | init.normal_(m.weight.data, mean=1, std=0.02) 166 | init.constant_(m.bias.data, 0) 167 | elif isinstance(m, nn.BatchNorm3d): 168 | init.normal_(m.weight.data, mean=1, std=0.02) 169 | init.constant_(m.bias.data, 0) 170 | elif isinstance(m, nn.Linear): 171 | init.xavier_normal_(m.weight.data) 172 | init.normal_(m.bias.data) 173 | elif isinstance(m, nn.LSTM): 174 | for param in m.parameters(): 175 | if len(param.shape) >= 2: 176 | init.orthogonal_(param.data) 177 | else: 178 | init.normal_(param.data) 179 | elif isinstance(m, nn.LSTMCell): 180 | for param in m.parameters(): 181 | if len(param.shape) >= 2: 182 | init.orthogonal_(param.data) 183 | else: 184 | init.normal_(param.data) 185 | elif isinstance(m, nn.GRU): 186 | for param in m.parameters(): 187 | if len(param.shape) >= 2: 188 | init.orthogonal_(param.data) 189 | else: 190 | init.normal_(param.data) 191 | elif isinstance(m, nn.GRUCell): 192 | for param in m.parameters(): 193 | if len(param.shape) >= 2: 194 | init.orthogonal_(param.data) 195 | else: 196 | init.normal_(param.data) 197 | 198 | 199 | # Reload the module after initialization 200 | estimator = Net() 201 | print(estimator) 202 | estimator.to(device) 203 | # optimizer = torch.optim.SGD(estimator.parameters(), lr=LR) 204 | # optimizer = torch.optim.SGD(estimator.parameters(), lr=LR, momentum=0.9) 205 | # optimizer = torch.optim.RMSprop(estimator.parameters(), lr=LR, alpha=0.9) 206 | optimizer = torch.optim.Adam(estimator.parameters(), lr=LR, betas=(0.9, 0.9)) 207 | # scheduler = CyclicLR(optimizer, base_lr=1e-7, max_lr=1e-5, step_size=300, mode='triangular') 208 | # optimizers = [opt_SGD, opt_Momentum, opt_RMSprop, opt_Adam] 209 | loss_func = torch.nn.MSELoss(size_average=True).to(device) 210 | 211 | # Power Injection 212 | GP = G[BP_mask] 213 | BP = B[BP_mask] 214 | GQ = G[BQ_mask] 215 | BQ = B[BQ_mask] 216 | # Power Flow 217 | GPF = G[PF_FR, PF_TO].unsqueeze(1) 218 | BPF = B[PF_FR, PF_TO].unsqueeze(1) 219 | GQF = G[QF_FR, QF_TO].unsqueeze(1) 220 | BQF = B[QF_FR, QF_TO].unsqueeze(1) 221 | 222 | 223 | def power_flow(outputs): 224 | # outputs = outputs.squeeze(0) 225 | outputs = outputs.permute(1, 0) 226 | Z_hat = Variable(torch.zeros(M, 1)).to(device) 227 | A = Variable(ref_ang * torch.ones(nBus, 1)).to(device) 228 | A[:68] = outputs[0:68] # voltage angle 229 | A[69:] = outputs[68:nBus - 1] # voltage angle 230 | V = outputs[nBus - 1:] # voltage magnitude 231 | 232 | ## V 233 | Z_hat[vi, :] = V[Vmask] 234 | 235 | ## Pi 236 | VP_FR = V[BP_mask].repeat(1, nBus) 237 | VP_TO = V.repeat(1, nBus).permute(1, 0)[BP_mask] 238 | 239 | AP_FR = A[BP_mask].repeat(1, nBus) 240 | AP_TO = A.repeat(1, nBus).permute(1, 0)[BP_mask] 241 | 242 | temp = VP_FR * VP_TO * (GP * torch.cos(AP_FR - AP_TO) + BP * torch.sin(AP_FR - AP_TO)) 243 | Z_hat[ppi, :] = torch.sum(temp, 1, keepdim=True) 244 | 245 | ## Qi 246 | VQ_FR = V[BQ_mask].repeat(1, nBus) 247 | VQ_TO = V.repeat(1, nBus).permute(1, 0)[BQ_mask] 248 | 249 | AQ_FR = A[BQ_mask].repeat(1, nBus) 250 | AQ_TO = A.repeat(1, nBus).permute(1, 0)[BQ_mask] 251 | 252 | temp = VQ_FR * VQ_TO * (GQ * torch.sin(AQ_FR - AQ_TO) - BQ * torch.cos(AQ_FR - AQ_TO)) 253 | Z_hat[qi, :] = torch.sum(temp, 1, keepdim=True) 254 | 255 | ## Pij 256 | Z_hat[ppf, :] = -V[PF_FR] * V[PF_FR] * GPF - V[PF_FR] * V[PF_TO] * ( 257 | -GPF * torch.cos(A[PF_FR] - A[PF_TO]) - BPF * torch.sin(A[PF_FR] - A[PF_TO])) 258 | 259 | # Qij 260 | Z_hat[qf, :] = V[QF_FR] * V[QF_FR] * BQF - V[QF_FR] * V[QF_TO] * ( 261 | -GQF * torch.sin(A[QF_FR] - A[QF_TO]) + BQF * torch.cos(A[QF_FR] - A[QF_TO])) 262 | 263 | # return Z_hat.permute(1, 0) 264 | return Z_hat.squeeze() 265 | 266 | 267 | ######################################## 268 | ##Batchsize, Build up 3D operation 269 | ######################################## 270 | # Power Injection 271 | B_GP = G[BP_mask].repeat(BATCH_SIZE, 1, 1) 272 | B_BP = B[BP_mask].repeat(BATCH_SIZE, 1, 1) 273 | B_GQ = G[BQ_mask].repeat(BATCH_SIZE, 1, 1) 274 | B_BQ = B[BQ_mask].repeat(BATCH_SIZE, 1, 1) 275 | # Power Flow 276 | B_GPF = G[PF_FR, PF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 277 | B_BPF = B[PF_FR, PF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 278 | B_GQF = G[QF_FR, QF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 279 | B_BQF = B[QF_FR, QF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 280 | 281 | 282 | def power_flow_batch(outputs): 283 | outputs = outputs.unsqueeze(2) 284 | Z_hat = Variable(torch.zeros(BATCH_SIZE, M, 1)).to(device) 285 | A = Variable(ref_ang * torch.ones(BATCH_SIZE, nBus, 1)).to(device) 286 | A[:, :68] = outputs[:, 0:68] # voltage angle 287 | A[:, 69:] = outputs[:, 68:nBus - 1] # voltage angle 288 | V = outputs[:, nBus - 1:] # voltage magnitude 289 | 290 | ## V 291 | Z_hat[:, vi, :] = V[:, Vmask, :] 292 | ## Pi 293 | B_VP_FR = V[:, BP_mask].repeat(1, 1, nBus) 294 | B_VP_TO = V.repeat(1, 1, nBus).permute(0, 2, 1)[:, BP_mask] 295 | 296 | B_AP_FR = A[:, BP_mask].repeat(1, 1, nBus) 297 | B_AP_TO = A.repeat(1, 1, nBus).permute(0, 2, 1)[:, BP_mask] 298 | 299 | temp = B_VP_FR * B_VP_TO * (B_GP * torch.cos(B_AP_FR - B_AP_TO) + B_BP * torch.sin(B_AP_FR - B_AP_TO)) 300 | Z_hat[:, ppi, :] = torch.sum(temp, 2, keepdim=True) 301 | 302 | ## Qi 303 | B_VQ_FR = V[:, BQ_mask].repeat(1, 1, nBus) 304 | B_VQ_TO = V.repeat(1, 1, nBus).permute(0, 2, 1)[:, BQ_mask] 305 | 306 | B_AQ_FR = A[:, BQ_mask].repeat(1, 1, nBus) 307 | B_AQ_TO = A.repeat(1, 1, nBus).permute(0, 2, 1)[:, BQ_mask] 308 | 309 | temp = B_VQ_FR * B_VQ_TO * (B_GQ * torch.sin(B_AQ_FR - B_AQ_TO) - B_BQ * torch.cos(B_AQ_FR - B_AQ_TO)) 310 | Z_hat[:, qi, :] = torch.sum(temp, 2, keepdim=True) 311 | ## Pij 312 | Z_hat[:, ppf, :] = -V[:, PF_FR] * V[:, PF_FR] * B_GPF - V[:, PF_FR] * V[:, PF_TO] * ( 313 | -B_GPF * torch.cos(A[:, PF_FR] - A[:, PF_TO]) - B_BPF * torch.sin(A[:, PF_FR] - A[:, PF_TO])) 314 | 315 | # Qij 316 | Z_hat[:, qf, :] = V[:, QF_FR] * V[:, QF_FR] * B_BQF - V[:, QF_FR] * V[:, QF_TO] * ( 317 | -B_GQF * torch.sin(A[:, QF_FR] - A[:, QF_TO]) + B_BQF * torch.cos(A[:, QF_FR] - A[:, QF_TO])) 318 | 319 | return Z_hat.squeeze(2) 320 | 321 | 322 | # def batch_train_params(): 323 | # # initialize the parameters of NETWORK 324 | # hidden = None 325 | # 326 | # with trange(0, 300) as numEpoch: 327 | # for epoch in numEpoch: 328 | # for step, (batch_train, batch_target) in enumerate(loader): 329 | # batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 330 | # inputs = Variable(batch_train, requires_grad=True).to(device) 331 | # targets = Variable(batch_target).to(device) 332 | # hidden = repackage_hidden(hidden) 333 | # outputs, hidden = estimator(inputs, hidden) 334 | # loss = loss_func(outputs, targets) 335 | # optimizer.zero_grad() 336 | # loss.backward() 337 | # optimizer.step() 338 | # numEpoch.set_postfix(Loss='%0.32f' % loss) 339 | # torch.save(estimator.state_dict(), 'initial_batch_params_TS.pkl') 340 | 341 | 342 | def batch_train_params(): 343 | print('Start Initializing...') 344 | # estimator.apply(weight_init) 345 | 346 | init_sv = torch.ones(N) 347 | init_sv[:nBus - 1] = ref_ang * init_sv[:nBus - 1] 348 | init_sv = init_sv.repeat(BATCH_SIZE, 1).to(device) 349 | 350 | hidden = None 351 | 352 | with trange(0, 50) as numEpoch: 353 | for epoch in numEpoch: 354 | for step, (batch_train, batch_target) in enumerate(loader2): 355 | batch_train = batch_train.view(1, batch_train.shape[0],batch_train.shape[1]) 356 | inputs = Variable(batch_train, requires_grad=True).to(device) 357 | # targets = Variable(init_sv).to(device) 358 | targets = Variable(batch_target).to(device) 359 | 360 | hidden = repackage_hidden(hidden) 361 | 362 | optimizer.zero_grad() 363 | outputs, hidden = estimator(inputs, hidden) 364 | loss = loss_func(outputs, targets) 365 | loss.backward() 366 | optimizer.step() 367 | # numEpoch.set_postfix(Loss='%0.8f' % loss) 368 | print('Loss=%0.8f' % loss) 369 | torch.save(estimator.state_dict(), 'initial_batch_params.pkl') 370 | return hidden 371 | 372 | def train(hidden): 373 | print('Starting Training...') 374 | estimator.load_state_dict(torch.load('initial_batch_params.pkl')) 375 | # for param_group in optimizer.param_groups: 376 | # param_group['lr'] = 1e-5 377 | scheduler = CyclicLR(optimizer, base_lr=1e-6, max_lr=1e-4, step_size=1500, mode='triangular2') 378 | 379 | # hidden = None 380 | 381 | # init_sv = torch.ones(N) 382 | # init_sv[:nBus - 1] = ref_ang * init_sv[:nBus - 1] 383 | # init_sv = init_sv.repeat(BATCH_SIZE, 1).to(device) 384 | # hidden = init_sv 385 | # file = xlwt.Workbook() 386 | with trange(0, EPOCH) as numEPoch: 387 | for epoch in numEPoch: 388 | scheduler.step() 389 | for step, (batch_train, batch_targets) in enumerate(loader1): 390 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 391 | inputs = Variable(batch_train, requires_grad=True).to(device) 392 | targets = Variable(batch_targets).to(device) 393 | # Starting each batch, we detach the hidden state from how it was previously produced. 394 | # If we didn't, the model would try backpropagating all the way to start of the dataset. 395 | hidden = repackage_hidden(hidden) 396 | optimizer.zero_grad() 397 | outputs, hidden = estimator(inputs, hidden) 398 | Z_hat = power_flow_batch(outputs) 399 | 400 | # outputs = outputs.squeeze() 401 | # sheet1 = file.add_sheet('outputs') 402 | # for j in range(len(outputs)): 403 | # sheet1.write(j, 0, outputs[j].item()) 404 | # Z_hat = Z_hat.squeeze() 405 | # sheet2 = file.add_sheet('Zhat') 406 | # for j in range(len(Z_hat)): 407 | # sheet2.write(j, 0, Z_hat[j].item()) 408 | # 409 | # ffilename = 'dataverify.xls' 410 | # file.save(ffilename) 411 | 412 | # Z_hat[abs(Z_hat) < 1e-5] = 0 413 | loss = loss_func(Z_hat, targets) 414 | loss.backward() 415 | optimizer.step() 416 | 417 | numEPoch.set_postfix(Loss='%0.8f' % loss) 418 | print('Loss=%0.8f' % loss) 419 | torch.save(estimator.state_dict(), 'final_params.pkl') 420 | return hidden 421 | 422 | 423 | # Load streaming data 424 | stream_data = pd.read_excel(xls, sheetname='TestData', header=None) 425 | stream_data = stream_data.as_matrix() 426 | stream_data = torch.from_numpy(stream_data).float() 427 | stream_torch_dataset = Data.TensorDataset(stream_data, stream_data) 428 | stream_loader = Data.DataLoader(dataset=stream_torch_dataset, batch_size=1, shuffle=False, 429 | # random shuffle for training 430 | num_workers=2, # sub-processes for loading data 431 | ) 432 | 433 | 434 | def pfm_test(hidden): 435 | estimator.load_state_dict(torch.load('final_params.pkl')) 436 | # for param_group in optimizer.param_groups: 437 | # param_group['lr'] = 1e-8 438 | print('Online Training...') 439 | file = xlwt.Workbook() 440 | his_loss = [] 441 | # hidden = None 442 | for step, (batch_train, batch_targets) in enumerate(stream_loader): 443 | starttime = time.time() 444 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 445 | # (seq_len, batch, input_size) 446 | inputs = Variable(batch_train, requires_grad=True).to(device) 447 | targets = Variable(batch_targets).to(device) 448 | targets = targets.squeeze() 449 | 450 | hidden = repackage_hidden(hidden) 451 | 452 | outputs, hidden = estimator(inputs, hidden) 453 | Z_hat = power_flow(outputs) 454 | 455 | # outputs = outputs.squeeze() 456 | # sheet1 = file.add_sheet('outputs') 457 | # for j in range(len(outputs)): 458 | # sheet1.write(j, 0, outputs[j].item()) 459 | # Z_hat = Z_hat.squeeze() 460 | # sheet2 = file.add_sheet('Zhat') 461 | # for j in range(len(Z_hat)): 462 | # sheet2.write(j, 0, Z_hat[j].item()) 463 | # 464 | # ffilename = 'dataverify.xls' 465 | # file.save(ffilename) 466 | 467 | loss = loss_func(Z_hat, targets) 468 | his_loss.append(loss.item()) 469 | # if loss.item() < 0.005: 470 | optimizer.zero_grad() 471 | loss.backward() 472 | optimizer.step() 473 | 474 | print(time.time() - starttime) 475 | outputs = outputs.squeeze() 476 | if step > 16261: 477 | sheet = file.add_sheet(str(step), cell_overwrite_ok=True) 478 | for j in range(len(outputs)): 479 | sheet.write(j, 0, outputs[j].item()) 480 | sheet1 = file.add_sheet('loss') 481 | for j in range(len(his_loss)): 482 | sheet1.write(j, 0, his_loss[j]) 483 | ffilename = 'dnn-test.xls' 484 | file.save(ffilename) 485 | 486 | 487 | def main(): 488 | hidden = batch_train_params() 489 | hidden = train(hidden) 490 | hidden = (hidden[0][:,-1,:].unsqueeze(1).contiguous(),hidden[1][:,-1,:].unsqueeze(1).contiguous()) 491 | pfm_test(hidden) 492 | 493 | 494 | if __name__ == "__main__": 495 | main() 496 | -------------------------------------------------------------------------------- /LSTM/IEEE118/Readme: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /LSTM/IEEE118/cyclic_lr_scheduler.py: -------------------------------------------------------------------------------- 1 | import math 2 | import numpy as np 3 | from torch.optim.optimizer import Optimizer 4 | 5 | 6 | class _LRScheduler(object): 7 | def __init__(self, optimizer, last_epoch=-1): 8 | if not isinstance(optimizer, Optimizer): 9 | raise TypeError('{} is not an Optimizer'.format( 10 | type(optimizer).__name__)) 11 | self.optimizer = optimizer 12 | if last_epoch == -1: 13 | for group in optimizer.param_groups: 14 | group.setdefault('initial_lr', group['lr']) 15 | else: 16 | for i, group in enumerate(optimizer.param_groups): 17 | if 'initial_lr' not in group: 18 | raise KeyError("param 'initial_lr' is not specified " 19 | "in param_groups[{}] when resuming an optimizer".format(i)) 20 | self.base_lrs = list(map(lambda group: group['initial_lr'], optimizer.param_groups)) 21 | self.step(last_epoch + 1) 22 | self.last_epoch = last_epoch 23 | 24 | def get_lr(self): 25 | raise NotImplementedError 26 | 27 | def step(self, epoch=None): 28 | if epoch is None: 29 | epoch = self.last_epoch + 1 30 | self.last_epoch = epoch 31 | for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): 32 | param_group['lr'] = lr 33 | 34 | 35 | class CyclicLR(_LRScheduler): 36 | 37 | def __init__(self, optimizer, base_lr, max_lr, step_size, gamma=0.99, mode='triangular', last_epoch=-1): 38 | self.optimizer = optimizer 39 | self.base_lr = base_lr 40 | self.max_lr = max_lr 41 | self.step_size = step_size 42 | self.gamma = gamma 43 | self.mode = mode 44 | assert mode in ['triangular', 'triangular2', 'exp_range'] 45 | super(CyclicLR, self).__init__(optimizer, last_epoch) 46 | 47 | def get_lr(self): 48 | new_lr = [] 49 | # make sure that the length of base_lrs doesn't change. Dont care about the actual value 50 | for base_lr in self.base_lrs: 51 | cycle = np.floor(1 + self.last_epoch / (2 * self.step_size)) 52 | x = np.abs(float(self.last_epoch) / self.step_size - 2 * cycle + 1) 53 | if self.mode == 'triangular': 54 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) 55 | elif self.mode == 'triangular2': 56 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) / float(2 ** (cycle - 1)) 57 | elif self.mode == 'exp_range': 58 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) * (self.gamma ** ( 59 | self.last_epoch)) 60 | new_lr.append(lr) 61 | return new_lr -------------------------------------------------------------------------------- /LSTM/IEEE118/final_params.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/LSTM/IEEE118/final_params.pkl -------------------------------------------------------------------------------- /LSTM/IEEE118/initial_batch_params.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/LSTM/IEEE118/initial_batch_params.pkl -------------------------------------------------------------------------------- /LSTM/IEEE118/integratedata.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import xlwt 4 | 5 | xls = pd.ExcelFile('dnn-test.xls') 6 | total = np.zeros(235) 7 | for i in range(16262, 17133): 8 | sys_data = pd.read_excel(xls, sheetname=str(i), header=None) 9 | sys_data = sys_data.squeeze() 10 | # sys_data = sys_data.as_matrix() 11 | # print(total.shape) 12 | # print(sys_data.shape) 13 | total = np.vstack((total, sys_data)) 14 | total = total[1:,:] 15 | _r, _c = total.shape 16 | file = xlwt.Workbook() 17 | sheet = file.add_sheet('Sheet1') 18 | for r in range(_r): 19 | for c in range(_c): 20 | sheet.write(r, c, total[r, c]) 21 | file.save('lstm.xls') 22 | 23 | -------------------------------------------------------------------------------- /LSTM/IEEE14/01.py: -------------------------------------------------------------------------------- 1 | # import matplotlib.pyplot as plt 2 | # import xlrd 3 | # import numpy as np 4 | # import pandas as pd 5 | # from numpy import linalg as LA 6 | # import xlwt 7 | # 8 | # # data_sheet = xlrd.open_workbook('result.xls') 9 | # # dataset = data_sheet.sheets()[0] 10 | # 11 | # 12 | # 13 | # real = pd.read_excel('./Results/real.xlsx', sheetname='Sheet1', header=None) 14 | # real = real.as_matrix() 15 | # real_angle = real[-288:, 0:13] # 7000:8000 16 | # real_voltage = real[-288:, 13:] 17 | # 18 | # h_real_voltage = [] 19 | # for i in range(24): 20 | # tmp = np.sum(h_real_voltage[i * 5:(i + 1) * 5 - 1]) 21 | # h_real_voltage.append(1/12*tmp) 22 | # h_real_voltage = np.array(h_real_voltage) 23 | # h_real_voltage = h_real_voltage.squeeze() 24 | # 25 | # dnn = pd.read_excel('./Results/dnn-test-total.xls', sheetname='Sheet1', header=None) 26 | # dnn = dnn.as_matrix() 27 | # # sys_data = sys_data.T 28 | # dnn_angle = dnn[:, 0:13] 29 | # dnn_voltage = dnn[:, 13:] 30 | # 31 | # wls = pd.read_excel('./Results/wls.xlsx', sheetname='Sheet1', header=None) 32 | # wls = wls.as_matrix() 33 | # wls_angle = wls[-288:, 0:13] 34 | # wls_voltage = wls[-288:, 13:] 35 | # 36 | # 37 | # 38 | # wls_real_angle = (wls_angle - real_angle) ** 2 39 | # wls_real_voltage = (wls_voltage - real_voltage) ** 2 40 | # 41 | # dnn_real_angle = (dnn_angle - real_angle) ** 2 42 | # dnn_real_voltage = (dnn_voltage - real_voltage) ** 2 43 | # norm2_DNN_VA = 1 / dnn_real_angle.shape[1] * np.sqrt(np.sum(dnn_real_angle, axis=1)) 44 | # norm2_WLS_VA = 1 / wls_real_angle.shape[1] * np.sqrt(np.sum(wls_real_angle, axis=1)) 45 | # norm2_DNN_VM = 1 / dnn_real_voltage.shape[1] * np.sqrt(np.sum(dnn_real_voltage, axis=1)) 46 | # norm2_WLS_VM = 1 / wls_real_voltage.shape[1] * np.sqrt(np.sum(wls_real_voltage, axis=1)) 47 | # 48 | # 49 | # h_norm2_DNN_VA = [] 50 | # for i in range(24): 51 | # tmp = np.sum(norm2_DNN_VA[i * 5:(i + 1) * 5 - 1]) 52 | # h_norm2_DNN_VA.append(1/12*tmp) 53 | # h_norm2_DNN_VA = np.array(h_norm2_DNN_VA) 54 | # h_norm2_DNN_VA = h_norm2_DNN_VA.squeeze() 55 | # 56 | # h_norm2_WLS_VA = [] 57 | # for i in range(24): 58 | # tmp = np.sum(norm2_WLS_VA[i * 12:(i + 1) * 12]) 59 | # h_norm2_WLS_VA.append(1/12*tmp) 60 | # h_norm2_WLS_VA = np.array(h_norm2_WLS_VA) 61 | # h_norm2_WLS_VA = h_norm2_WLS_VA.squeeze() 62 | # 63 | # h_norm2_DNN_VM = [] 64 | # for i in range(24): 65 | # tmp = np.sum(norm2_DNN_VM[i * 12:(i + 1) * 12 ]) 66 | # h_norm2_DNN_VM.append(1/12*tmp) 67 | # h_norm2_DNN_VM = np.array(h_norm2_DNN_VM) 68 | # h_norm2_DNN_VM = h_norm2_DNN_VM.squeeze() 69 | # 70 | # h_norm2_WLS_VM = [] 71 | # for i in range(24): 72 | # tmp = np.sum(norm2_WLS_VM[i * 12:(i + 1) * 12]) 73 | # h_norm2_WLS_VM.append(1/12*tmp) 74 | # h_norm2_WLS_VM = np.array(h_norm2_WLS_VM) 75 | # h_norm2_WLS_VM = h_norm2_WLS_VM.squeeze() 76 | # 77 | # ''' 78 | # norm2_DNN_VA, norm2_WLS_VA, norm2_DNN_VM, norm2_WLS_VM = [], [], [], [] 79 | # for i in range(100): 80 | # 81 | # norm2_DNN_VA.append(LA.norm(dnn_angle - real_angle)) 82 | # norm2_WLS_VA.append(LA.norm(wls_angle - real_angle)) 83 | # norm2_DNN_VM.append(LA.norm(dnn_voltage - real_voltage)) 84 | # norm2_WLS_VM.append(LA.norm(wls_voltage - real_voltage)) 85 | # 86 | # print('norm2_DNN_VA: ', LA.norm(dnn_angle - real_angle)) 87 | # print('norm2_WLS_VA: ', LA.norm(wls_angle - real_angle)) 88 | # 89 | # print('norm2_DNN_VM: ', LA.norm(dnn_voltage - real_voltage)) 90 | # print('norm2_WLS_VM: ', LA.norm(wls_voltage - real_voltage)) 91 | # print(50 * '*') 92 | # 93 | # file = xlwt.Workbook() 94 | # sheet = file.add_sheet('sheet1', cell_overwrite_ok=True) 95 | # for i in range(100): 96 | # # print(type(measurement)) 97 | # sheet.write(i, 0, norm2_DNN_VA[i]) 98 | # sheet.write(i, 1, norm2_WLS_VA[i]) 99 | # sheet.write(i, 2, norm2_DNN_VM[i]) 100 | # sheet.write(i, 3, norm2_WLS_VM[i]) 101 | # file.save('Euclidean.xls') 102 | # ''' 103 | # 104 | # ''' 105 | # # 设置图例并且设置图例的字体及大小 106 | # font1 = {'family': 'Times New Roman', 107 | # 'weight': 'normal', 108 | # 'size': 12, 109 | # } 110 | # 111 | # # 设置坐标刻度值的大小以及刻度值的字体 112 | # # plt.tick_params(labelsize=15) 113 | # 114 | # font2 = {'family' : 'Times New Roman', 115 | # 'weight' : 'normal', 116 | # 'size' : 14, 117 | # } 118 | # 119 | # angle_axis = np.arange(1, 14, 1) 120 | # print('angle') 121 | # p1.plot(angle_axis, dnn_angle, 'x-', color='red', label='DNN', linewidth=1.0) 122 | # p1.plot(angle_axis, wls_angle, '*-', color='green', label='WLS', linewidth=1.0) 123 | # p1.plot(angle_axis, real_angle, '.-', color='blue', label='Real', linestyle='--') 124 | # p1.set_xlabel('Bus Number', font2) 125 | # p1.set_ylabel('Voltage Angle(degree)', font2) 126 | # p1.set_xticks(angle_axis) 127 | # p1.grid(axis='y') 128 | # p1.legend() 129 | # # 130 | # magnitude_axis = np.arange(1, 15, 1) 131 | # print('magnitude') 132 | # p2.plot(magnitude_axis, dnn_voltage, 'x-', color='red', label='DNN', linewidth=1.0) 133 | # p2.plot(magnitude_axis, wls_voltage, '*-', color='green', label='WLS', linewidth=1.0) 134 | # p2.plot(magnitude_axis, real_voltage, '.-', color='blue', label='Real', linestyle='--') 135 | # p2.set_xlabel('Bus Number', font2) 136 | # p2.set_ylabel('Voltage Magnitude(pu)', font2) 137 | # p2.set_xticks(magnitude_axis) 138 | # p2.grid(axis='y') 139 | # p2.legend() 140 | # 141 | # # legend = plt.legend(prop=font1) 142 | # # plt.xticks(x_axis) 143 | # # plt.grid(axis='y') 144 | # plt.show() 145 | # 146 | # exit() 147 | # ''' 148 | # # plt.tick_params(labelsize=15) 149 | # 150 | # font2 = {'family' : 'Times New Roman', 151 | # 'weight' : 'normal', 152 | # 'size' : 14, 153 | # } 154 | # 155 | # 156 | # # ''' 157 | # plt.figure() 158 | # p1 = plt.subplot() 159 | # # p2 = plt.subplot(122) 160 | # width = 0.3 161 | # ind = np.arange(len(h_norm2_DNN_VA)) 162 | # # fig, ax = plt.subplots() 163 | # rects1 = p1.bar(ind, h_norm2_DNN_VA, width, color='r') 164 | # rects2 = p1.bar(ind + width, h_norm2_WLS_VA, width, color='b') 165 | # 166 | # print('*****************DNN**************') 167 | # print('5min',norm2_DNN_VA[0]) 168 | # print('1h',np.sum(norm2_DNN_VA[0:12])/12) 169 | # print('one day',np.sum(norm2_DNN_VA) / len(norm2_DNN_VA)) 170 | # print('*****************WLS**************') 171 | # print('5min',norm2_WLS_VA[0]) 172 | # print('1h',np.sum(norm2_WLS_VA[0:12])/12) 173 | # print('one day',np.sum(norm2_WLS_VA) / len(norm2_WLS_VA)) 174 | # # add some text for labels, title and axes ticks 175 | # p1.set_ylabel('RMSE', font2) 176 | # p1.set_title('IEEE14 voltage angles', font2) 177 | # # ax.set_xticks(ind + width / 2) 178 | # 179 | # 180 | # # ind = np.arange(len(h_norm2_DNN_VM)) 181 | # # rects3 = p2.bar(ind, h_norm2_DNN_VM, width, color='r') 182 | # # rects4 = p2.bar(ind + width, h_norm2_WLS_VM, width, color='b') 183 | # # print('*****************DNN**************') 184 | # # print('5min',norm2_DNN_VM[0]) 185 | # # print('1h',np.sum(norm2_DNN_VM[0:12])/12) 186 | # # print('one day',np.sum(norm2_DNN_VM) / len(norm2_DNN_VM)) 187 | # # 188 | # # print('*****************WLS**************') 189 | # # print('5min',norm2_WLS_VM[0]) 190 | # # print('1h',np.sum(norm2_WLS_VM[0:12])/12) 191 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 192 | # # 193 | # # # add some text for labels, title and axes ticks 194 | # # p2.set_ylabel('RMSE', font2) 195 | # # p2.set_title('IEEE14 voltage magnitudes', font2) 196 | # # # ax.set_xticks(ind + width / 2) 197 | # 198 | # 199 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 200 | # # p2.legend((rects3[0], rects4[0]), ('DNN', 'WLS')) 201 | # plt.show() 202 | # ''' 203 | # 204 | # #plot msr_rmse 205 | # width = 0.5 206 | # plt.figure() 207 | # p1 = plt.subplot() 208 | # wls_msr_rmse = pd.read_excel('./Results/msr_rmse.xlsx', sheetname='rmse', header=None) 209 | # wls_msr_rmse = wls_msr_rmse [584:] 210 | # h_wls_msr_rmse = [] 211 | # for i in range(24): 212 | # tmp = np.sum(wls_msr_rmse[i * 5:(i + 1) * 5 - 1]) 213 | # h_wls_msr_rmse.append(1/12*tmp) 214 | # h_wls_msr_rmse = np.array(h_wls_msr_rmse) 215 | # h_wls_msr_rmse = h_wls_msr_rmse.squeeze() 216 | # # wls_msr_rmse = wls_msr_rmse.as_matrix() 217 | # print('*****************WLS**************') 218 | # # print('5min',wls_msr_rmse[0]) 219 | # # print('1h',np.sum(wls_msr_rmse[0:12])/12) 220 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 221 | # 222 | # # p1.plot(wls_msr_rmse) 223 | # 224 | # 225 | # 226 | # dnn_msr_mse = pd.read_excel('./Results/dnn.xls', sheetname='loss', header=None) 227 | # # dnn_msr_mse = dnn_msr_mse.as_matrix() 228 | # dnn_msr_rmse = np.sqrt(dnn_msr_mse) 229 | # dnn_msr_rmse = dnn_msr_rmse[584:] 230 | # 231 | # h_dnn_msr_rmse = [] 232 | # for j in range(24): 233 | # tmp = np.sum(dnn_msr_rmse[ j*5:((j + 1)*5 - 1)]) 234 | # h_dnn_msr_rmse.append(1/12*tmp) 235 | # h_dnn_msr_rmse = np.array(h_dnn_msr_rmse) 236 | # h_dnn_msr_rmse = h_dnn_msr_rmse.squeeze() 237 | # print('*****************DNN**************') 238 | # # print('5min',norm2_WLS_VM[0]) 239 | # # print('1h',np.sum(norm2_WLS_VM[0:12])/12) 240 | # # print('one day',np.sum(norm2_WLS_VM) / len(norm2_WLS_VM)) 241 | # 242 | # 243 | # ind = np.arange(len(h_dnn_msr_rmse)) 244 | # rects1 = p1.bar(ind, h_dnn_msr_rmse, width, color='r') 245 | # rects2 = p1.bar(ind + width, h_wls_msr_rmse, width, color='b') 246 | # p1.set_ylabel('RMSE', font2) 247 | # p1.set_title('Measurement RMSE in IEEE14', font2) 248 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 249 | # # plt.plot(ind, dnn_msr_rmse, ind, wls_msr_rmse) 250 | # 251 | # plt.show() 252 | # 253 | # ''' 254 | 255 | 256 | import pandas as pd 257 | import matplotlib.pyplot as plt 258 | import numpy as np 259 | from numpy import linalg as LA 260 | from matplotlib.patches import ConnectionPatch 261 | import xlwt 262 | 263 | # # 设置图例并且设置图例的字体及大小 264 | font1 = {'family': 'Times New Roman', 265 | 'weight': 'normal', 266 | 'size': 18, 267 | } 268 | 269 | font2 = {'family': 'Times New Roman', 270 | 'weight': 'normal', 271 | 'size': 20, 272 | } 273 | 274 | wls = pd.read_excel('./Results/wls.xlsx', sheetname='Sheet1', header=None) 275 | wls = wls.as_matrix() 276 | mask = np.where(np.isnan(wls[:, 0]))[0] 277 | wls = np.delete(wls, mask, axis=0) 278 | 279 | 280 | wls_angle = wls[:, 0:13] 281 | wls_voltage = wls[:, 13:] 282 | 283 | dnn = pd.read_excel('./Results/dnn-test-total.xls', sheetname='Sheet1', header=None) 284 | dnn = dnn.as_matrix() 285 | dnn = np.delete(dnn, mask, axis=0) 286 | 287 | 288 | # sys_data = sys_data.T 289 | dnn_angle = dnn[:, 0:13] 290 | dnn_voltage = dnn[:, 13:] 291 | 292 | real = pd.read_excel('./Results/real.xlsx', sheetname='Sheet1', header=None) 293 | real = real.as_matrix() 294 | real = np.delete(real, mask, axis=0) 295 | 296 | real_angle = real[:, 0:13] 297 | real_voltage = real[:, 13:] 298 | 299 | wls_real_angle = (wls_angle - real_angle) ** 2 300 | wls_real_voltage = (wls_voltage - real_voltage) ** 2 301 | 302 | dnn_real_angle = (dnn_angle - real_angle) ** 2 303 | dnn_real_voltage = (dnn_voltage - real_voltage) ** 2 304 | norm2_DNN_VA = 1 / dnn_real_angle.shape[1] * np.sqrt(np.sum(dnn_real_angle, axis=1)) 305 | norm2_WLS_VA = 1 / wls_real_angle.shape[1] * np.sqrt(np.sum(wls_real_angle, axis=1)) 306 | mask1 = np.where(norm2_WLS_VA > 0.05) 307 | norm2_DNN_VM = 1 / dnn_real_voltage.shape[1] * np.sqrt(np.sum(dnn_real_voltage, axis=1)) 308 | norm2_WLS_VM = 1 / wls_real_voltage.shape[1] * np.sqrt(np.sum(wls_real_voltage, axis=1)) 309 | mask2 = np.where(norm2_WLS_VM > 0.02) 310 | mask3 = np.hstack((mask1, mask2)) 311 | mask3 = np.unique(mask3) 312 | 313 | norm2_DNN_VA = np.delete(norm2_DNN_VA, mask3, axis=0) 314 | norm2_WLS_VA = np.delete(norm2_WLS_VA, mask3, axis=0) 315 | norm2_DNN_VM = np.delete(norm2_DNN_VM, mask3, axis=0) 316 | norm2_WLS_VM = np.delete(norm2_WLS_VM, mask3, axis=0) 317 | 318 | norm2_DNN_VA = norm2_DNN_VA[-288:] 319 | norm2_WLS_VA = norm2_WLS_VA[-288:] 320 | norm2_DNN_VM = norm2_DNN_VM[-288:] 321 | norm2_WLS_VM = norm2_WLS_VM[-288:] 322 | 323 | 324 | print(len(norm2_DNN_VA)) 325 | 326 | h_norm2_DNN_VA = [] 327 | for i in range(len(norm2_DNN_VA)): 328 | if (i + 1) % 12 == 0: 329 | tmp = np.sum(norm2_DNN_VA[i + 1 - 12:i + 1]) 330 | h_norm2_DNN_VA.append(1 / 12 * tmp) 331 | print(i) 332 | elif (len(norm2_DNN_VA) - i) < 12: 333 | tmp = np.sum(norm2_DNN_VA[i: len(norm2_DNN_VA)]) 334 | h_norm2_DNN_VA.append(1 / (len(norm2_WLS_VM) - i) * tmp) 335 | break 336 | h_norm2_DNN_VA = np.array(h_norm2_DNN_VA) 337 | h_norm2_DNN_VA = h_norm2_DNN_VA.squeeze() 338 | 339 | h_norm2_WLS_VA = [] 340 | for i in range(len(norm2_WLS_VA)): 341 | if (i + 1) % 12 == 0: 342 | tmp = np.sum(norm2_WLS_VA[i + 1 - 12:i + 1]) 343 | h_norm2_WLS_VA.append(1 / 12 * tmp) 344 | elif (len(norm2_WLS_VA) - i - 1) < 12: 345 | tmp = np.sum(norm2_WLS_VA[i: len(norm2_WLS_VA)]) 346 | h_norm2_WLS_VA.append(1 / (len(norm2_WLS_VA) - i) * tmp) 347 | break 348 | h_norm2_WLS_VA = np.array(h_norm2_WLS_VA) 349 | h_norm2_WLS_VA = h_norm2_WLS_VA.squeeze() 350 | 351 | h_norm2_DNN_VM = [] 352 | for i in range(len(norm2_DNN_VM)): 353 | if (i + 1) % 12 == 0: 354 | tmp = np.sum(norm2_DNN_VM[i + 1 - 12:i + 1]) 355 | h_norm2_DNN_VM.append(1 / 12 * tmp) 356 | elif (len(norm2_DNN_VM) - i - 1) < 12: 357 | tmp = np.sum(norm2_DNN_VM[i: len(norm2_DNN_VM)]) 358 | h_norm2_DNN_VM.append(1 / (len(norm2_DNN_VM) - i) * tmp) 359 | break 360 | h_norm2_DNN_VM = np.array(h_norm2_DNN_VM) 361 | h_norm2_DNN_VM = h_norm2_DNN_VM.squeeze() 362 | 363 | h_norm2_WLS_VM = [] 364 | for i in range(len(norm2_WLS_VM)): 365 | if (i + 1) % 12 == 0: 366 | tmp = np.sum(norm2_WLS_VM[i + 1 - 12:i + 1]) 367 | h_norm2_WLS_VM.append(1 / 12 * tmp) 368 | elif (len(norm2_WLS_VM) - i - 1) < 12: 369 | tmp = np.sum(norm2_WLS_VM[i: len(norm2_WLS_VM)]) 370 | h_norm2_WLS_VM.append(1 / (len(norm2_WLS_VM) - i) * tmp) 371 | break 372 | h_norm2_WLS_VM = np.array(h_norm2_WLS_VM) 373 | h_norm2_WLS_VM = h_norm2_WLS_VM.squeeze() 374 | 375 | # print('*****************DNN**************') 376 | # print('5min', norm2_DNN_VA[0]) 377 | # print('1h', np.sum(norm2_DNN_VA[0:12]) / 12) 378 | # print('one day', np.sum(norm2_DNN_VA) / len(norm2_DNN_VA)) 379 | # print('*****************WLS**************') 380 | # print('5min', norm2_WLS_VA[0]) 381 | # print('1h', np.sum(norm2_WLS_VA[0:12]) / 12) 382 | # print('one day', np.sum(norm2_WLS_VA) / len(norm2_WLS_VA)) 383 | # 384 | # print('*****************DNN**************') 385 | # print('5min', norm2_DNN_VM[0]) 386 | # print('1h', np.sum(norm2_DNN_VM[0:12]) / 12) 387 | # print('one day', np.sum(norm2_DNN_VM) / len(norm2_DNN_VM)) 388 | # 389 | # print('*****************WLS**************') 390 | # print('5min', norm2_WLS_VM[0]) 391 | # print('1h', np.sum(norm2_WLS_VM[0:12]) / 12) 392 | # print('one day', np.sum(norm2_WLS_VM) / 280) 393 | 394 | 395 | # print('DNN_VA5MIN', np.max(norm2_DNN_VA)) 396 | # print('WLS_VA5MIN', np.max(norm2_WLS_VA)) 397 | # print('DNN_VM5MIN', np.max(norm2_DNN_VM)) 398 | # print('WLS_VM5MIN', np.max(norm2_WLS_VM)) 399 | # 400 | # print('DNN_VA1H', np.max(h_norm2_DNN_VA)) 401 | # print('WLS_VA1H', np.max(h_norm2_WLS_VA)) 402 | # print('DNN_VM1H', np.max(h_norm2_DNN_VM)) 403 | # print('WLS_VM1H', np.max(h_norm2_WLS_VM)) 404 | 405 | print('DNN_VA5MIN', np.min(norm2_DNN_VA)) 406 | print('WLS_VA5MIN', np.min(norm2_WLS_VA)) 407 | print('DNN_VM5MIN', np.min(norm2_DNN_VM)) 408 | print('WLS_VM5MIN', np.min(norm2_WLS_VM)) 409 | 410 | print('DNN_VA1H', np.min(h_norm2_DNN_VA)) 411 | print('WLS_VA1H', np.min(h_norm2_WLS_VA)) 412 | print('DNN_VM1H', np.min(h_norm2_DNN_VM)) 413 | print('WLS_VM1H', np.min(h_norm2_WLS_VM)) 414 | 415 | 416 | 417 | 418 | 419 | # print(np.sum(norm2_WLS_VA)) 420 | plt.figure() 421 | p2 = plt.subplot() 422 | # p2 = plt.subplot(122) 423 | width = 0.3 424 | 425 | 426 | # ind = np.arange(len(h_norm2_DNN_VA)) 427 | # # fig, ax = plt.subplots() 428 | # rects1 = p1.bar(ind, h_norm2_DNN_VA, width, color='r') 429 | # rects2 = p1.bar(ind + width, h_norm2_WLS_VA, width, color='b') 430 | # # add some text for labels, title and axes ticks 431 | # p1.set_ylabel('THRMSE', font2) 432 | # p1.set_title('IEEE14 voltage angles',font2) 433 | # # ax.set_xticks(ind + width / 2) 434 | # 435 | # p1.legend((rects1[0], rects2[0]), ('DNN', 'WLS')) 436 | 437 | ind = np.arange(len(norm2_DNN_VM)) 438 | rects3 = p2.bar(ind, norm2_DNN_VM, width, color='r') 439 | rects4 = p2.bar(ind + width, norm2_WLS_VM, width, color='b') 440 | # add some text for labels, title and axes ticks 441 | p2.set_ylabel('THRMSE', font2) 442 | p2.set_title('IEEE14 voltage magnitudes', font2) 443 | p2.legend((rects3[0], rects4[0]), ('DNN', 'WLS')) 444 | 445 | 446 | plt.tick_params(labelsize=15) 447 | plt.show() 448 | 449 | 450 | 451 | -------------------------------------------------------------------------------- /LSTM/IEEE14/IEEE14.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | import math 4 | import time 5 | 6 | import matplotlib.pyplot as plt 7 | import numpy as np 8 | import pandas as pd 9 | import torch 10 | import torch.nn as nn 11 | import torch.nn.functional as F 12 | import torch.utils.data as Data 13 | import xlrd 14 | import xlwt 15 | from torch.autograd import Variable 16 | from tqdm import tqdm 17 | from tqdm import trange 18 | from cyclic_lr_scheduler import CyclicLR 19 | import torch.nn.init as init 20 | 21 | 22 | use_cuda = torch.cuda.is_available() 23 | device = torch.device("cuda:0" if use_cuda else "cpu") 24 | print(torch.cuda.get_device_name(torch.cuda.current_device())) 25 | 26 | xls = pd.ExcelFile('measurements.xlsx') 27 | sys_data = pd.read_excel(xls, sheet_name='Data', header=None) 28 | sys_data = sys_data.as_matrix() 29 | 30 | G = pd.read_excel(xls, sheet_name='Real', header=None) 31 | G = G.as_matrix() 32 | # Imag part 33 | imag = pd.read_excel(xls, sheet_name='Imag', header=None) 34 | B = imag.as_matrix() 35 | 36 | # According to the data frame (np. ndarray) 37 | m_type = sys_data[1] # type of the measurements 38 | FB = sys_data[2] # from bus 39 | TB = sys_data[3] # to bus 40 | R = sys_data[4] # covariance 41 | 42 | vi = np.argwhere(m_type == 1) # Type1: V 43 | Vmask = FB[vi] - 1 44 | ppi = np.argwhere(m_type == 2).squeeze() # Type2: Pi 45 | BP_mask = Variable(torch.from_numpy(FB[ppi] - 1).long()).squeeze().to(device) 46 | qi = np.argwhere(m_type == 3).squeeze() # Type3: Qi 47 | BQ_mask = Variable(torch.from_numpy(FB[qi] - 1).long()).squeeze().to(device) 48 | ppf = np.argwhere(m_type == 4).squeeze() # Type4: Pij 49 | PF_FR = Variable(torch.from_numpy(FB[ppf] - 1).long()).squeeze().to(device) 50 | PF_TO = Variable(torch.from_numpy(TB[ppf] - 1).long()).squeeze().to(device) 51 | qf = np.argwhere(m_type == 5).squeeze() # Type5: Qij 52 | QF_FR = Variable(torch.from_numpy(FB[qf] - 1).long()).squeeze().to(device) 53 | QF_TO = Variable(torch.from_numpy(TB[qf] - 1).long()).squeeze().to(device) 54 | 55 | nvi = len(vi) 56 | npi = len(ppi) 57 | nqi = len(qi) 58 | npf = len(ppf) 59 | nqf = len(qf) 60 | 61 | # Load features of the measurements 62 | nBus = 14 # Bus # of targeted system 63 | M = sys_data.shape[1] # Measurements # 64 | nSet = sys_data.shape[0] # Sets # of sys_data 65 | N = 2 * nBus - 1 # State variables # 66 | ref_ang = 0 * math.pi / 180 # reference bus angle 67 | 68 | # Use Variable container 69 | G = Variable(torch.from_numpy(G).float()).to(device) 70 | B = Variable(torch.from_numpy(B).float()).to(device) 71 | 72 | # Mini-batch DataLoader 73 | # Hyper parameters 74 | BATCH_SIZE = 32 75 | LR = 1e-4 76 | EPOCH = 100 77 | 78 | sys_data1 = torch.from_numpy(sys_data[5:]).float() 79 | iter_size = len(sys_data1) //BATCH_SIZE 80 | torch_dataset1 = Data.TensorDataset(sys_data1, sys_data1) 81 | loader1 = Data.DataLoader(dataset=torch_dataset1, # torch TensorDataset format 82 | batch_size=BATCH_SIZE, # mini batch size 83 | shuffle=False, # random shuffle for training 84 | num_workers=2, # sub-processes for loading data 85 | drop_last=True, 86 | ) 87 | 88 | 89 | sys_data2 = torch.from_numpy(sys_data[5:869]).float() 90 | 91 | true_data = pd.read_excel(xls, sheetname='WLS_Train', header=None) 92 | true_data = true_data.as_matrix() 93 | true_data = torch.from_numpy(true_data[:864]).float() 94 | 95 | torch_dataset2 = Data.TensorDataset(sys_data2, true_data) 96 | loader2 = Data.DataLoader(dataset=torch_dataset2, # torch TensorDataset format 97 | batch_size=BATCH_SIZE, # mini batch size 98 | shuffle=False, # random shuffle for training 99 | num_workers=2, # sub-processes for loading data 100 | drop_last=True, 101 | ) 102 | 103 | 104 | # Build up the NN module 105 | class Net(torch.nn.Module): 106 | def __init__(self): 107 | super(Net, self).__init__() 108 | self.lstm = nn.LSTM(input_size=M, 109 | hidden_size=128, 110 | num_layers=2, 111 | batch_first=False, 112 | ) 113 | self.out = nn.Linear(128, N) 114 | 115 | def forward(self, inputs, hidden): 116 | r_out, hidden = self.lstm(inputs, hidden) 117 | outputs = self.out(r_out[-1, :, :]) 118 | return outputs, hidden 119 | 120 | 121 | def repackage_hidden(h): 122 | "Wraps hidden states in new Tensors, to detach them from their history." 123 | if h is None: 124 | return h 125 | return [state.detach() for state in h] 126 | 127 | 128 | def weight_init(m): 129 | ''' 130 | Usage: 131 | model = Model() 132 | model.apply(weight_init) 133 | ''' 134 | if isinstance(m, nn.Linear):####################################### 135 | init.xavier_normal_(m.weight.data) 136 | init.normal_(m.bias.data) 137 | elif isinstance(m, nn.LSTM): ##################################### 138 | for param in m.parameters(): 139 | if len(param.shape) >= 2: 140 | init.orthogonal_(param.data) 141 | else: 142 | init.normal_(param.data) 143 | 144 | 145 | 146 | # Reload the module after initialization 147 | estimator = Net() 148 | estimator.to(device) 149 | optimizer = torch.optim.Adam(estimator.parameters(), lr=LR, betas=(0.9, 0.9)) 150 | loss_func = torch.nn.MSELoss(reduction='mean').to(device) 151 | l2 = torch.nn.MSELoss(reduction='sum').to(device) 152 | 153 | # Power Injection 154 | GP = G[BP_mask] 155 | BP = B[BP_mask] 156 | GQ = G[BQ_mask] 157 | BQ = B[BQ_mask] 158 | # Power Flow 159 | GPF = G[PF_FR, PF_TO].unsqueeze(1) 160 | BPF = B[PF_FR, PF_TO].unsqueeze(1) 161 | GQF = G[QF_FR, QF_TO].unsqueeze(1) 162 | BQF = B[QF_FR, QF_TO].unsqueeze(1) 163 | 164 | 165 | def power_flow(outputs): 166 | outputs = outputs.permute(1, 0) 167 | Z_hat = Variable(torch.zeros(M, 1)).to(device) 168 | A = Variable(ref_ang * torch.ones(nBus, 1)).to(device) 169 | A[1:nBus] = outputs[0:nBus - 1] # Reference Bus #1 170 | V = outputs[nBus - 1:] # voltage magnitude 171 | 172 | ## V 173 | Z_hat[vi, :] = V[Vmask] 174 | 175 | ## Pi 176 | VP_FR = V[BP_mask].repeat(1, nBus) 177 | VP_TO = V.repeat(1, nBus).permute(1, 0)[BP_mask] 178 | 179 | AP_FR = A[BP_mask].repeat(1, nBus) 180 | AP_TO = A.repeat(1, nBus).permute(1, 0)[BP_mask] 181 | 182 | temp = VP_FR * VP_TO * (GP * torch.cos(AP_FR - AP_TO) + BP * torch.sin(AP_FR - AP_TO)) 183 | Z_hat[ppi, :] = torch.sum(temp, 1, keepdim=True) 184 | 185 | ## Qi 186 | VQ_FR = V[BQ_mask].repeat(1, nBus) 187 | VQ_TO = V.repeat(1, nBus).permute(1, 0)[BQ_mask] 188 | 189 | AQ_FR = A[BQ_mask].repeat(1, nBus) 190 | AQ_TO = A.repeat(1, nBus).permute(1, 0)[BQ_mask] 191 | 192 | temp = VQ_FR * VQ_TO * (GQ * torch.sin(AQ_FR - AQ_TO) - BQ * torch.cos(AQ_FR - AQ_TO)) 193 | Z_hat[qi, :] = torch.sum(temp, 1, keepdim=True) 194 | 195 | ## Pij 196 | Z_hat[ppf, :] = -V[PF_FR] * V[PF_FR] * GPF - V[PF_FR] * V[PF_TO] * ( 197 | -GPF * torch.cos(A[PF_FR] - A[PF_TO]) - BPF * torch.sin(A[PF_FR] - A[PF_TO])) 198 | 199 | # Qij 200 | Z_hat[qf, :] = V[QF_FR] * V[QF_FR] * BQF - V[QF_FR] * V[QF_TO] * ( 201 | -GQF * torch.sin(A[QF_FR] - A[QF_TO]) + BQF * torch.cos(A[QF_FR] - A[QF_TO])) 202 | 203 | # return Z_hat.permute(1, 0) 204 | return Z_hat.squeeze() 205 | 206 | 207 | ######################################## 208 | ##Batchsize, Build up 3D operation 209 | ######################################## 210 | # Power Injection 211 | B_GP = G[BP_mask].repeat(BATCH_SIZE, 1, 1) 212 | B_BP = B[BP_mask].repeat(BATCH_SIZE, 1, 1) 213 | B_GQ = G[BQ_mask].repeat(BATCH_SIZE, 1, 1) 214 | B_BQ = B[BQ_mask].repeat(BATCH_SIZE, 1, 1) 215 | # Power Flow 216 | B_GPF = G[PF_FR, PF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 217 | B_BPF = B[PF_FR, PF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 218 | B_GQF = G[QF_FR, QF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 219 | B_BQF = B[QF_FR, QF_TO].unsqueeze(1).repeat(BATCH_SIZE, 1, 1) 220 | 221 | 222 | def power_flow_batch(outputs): 223 | outputs = outputs.unsqueeze(2) 224 | Z_hat = Variable(torch.zeros(BATCH_SIZE, M, 1)).to(device) 225 | A = Variable(ref_ang * torch.ones(BATCH_SIZE, nBus, 1)).to(device) 226 | A[:, 1:nBus] = outputs[:, 0:nBus - 1] # voltage angle 227 | V = outputs[:, nBus - 1:] # voltage magnitude 228 | ## V 229 | Z_hat[:, vi, :] = V[:, Vmask, :] 230 | ## Pi 231 | B_VP_FR = V[:, BP_mask].repeat(1, 1, nBus) 232 | B_VP_TO = V.repeat(1, 1, nBus).permute(0, 2, 1)[:, BP_mask] 233 | 234 | B_AP_FR = A[:, BP_mask].repeat(1, 1, nBus) 235 | B_AP_TO = A.repeat(1, 1, nBus).permute(0, 2, 1)[:, BP_mask] 236 | 237 | temp = B_VP_FR * B_VP_TO * (B_GP * torch.cos(B_AP_FR - B_AP_TO) + B_BP * torch.sin(B_AP_FR - B_AP_TO)) 238 | Z_hat[:, ppi, :] = torch.sum(temp, 2, keepdim=True) 239 | 240 | ## Qi 241 | B_VQ_FR = V[:, BQ_mask].repeat(1, 1, nBus) 242 | B_VQ_TO = V.repeat(1, 1, nBus).permute(0, 2, 1)[:, BQ_mask] 243 | 244 | B_AQ_FR = A[:, BQ_mask].repeat(1, 1, nBus) 245 | B_AQ_TO = A.repeat(1, 1, nBus).permute(0, 2, 1)[:, BQ_mask] 246 | 247 | temp = B_VQ_FR * B_VQ_TO * (B_GQ * torch.sin(B_AQ_FR - B_AQ_TO) - B_BQ * torch.cos(B_AQ_FR - B_AQ_TO)) 248 | Z_hat[:, qi, :] = torch.sum(temp, 2, keepdim=True) 249 | ## Pij 250 | Z_hat[:, ppf, :] = -V[:, PF_FR] * V[:, PF_FR] * B_GPF - V[:, PF_FR] * V[:, PF_TO] * ( 251 | -B_GPF * torch.cos(A[:, PF_FR] - A[:, PF_TO]) - B_BPF * torch.sin(A[:, PF_FR] - A[:, PF_TO])) 252 | 253 | # Qij 254 | Z_hat[:, qf, :] = V[:, QF_FR] * V[:, QF_FR] * B_BQF - V[:, QF_FR] * V[:, QF_TO] * ( 255 | -B_GQF * torch.sin(A[:, QF_FR] - A[:, QF_TO]) + B_BQF * torch.cos(A[:, QF_FR] - A[:, QF_TO])) 256 | 257 | return Z_hat.squeeze(2) 258 | 259 | 260 | # def batch_train_params(): 261 | # # initialize the parameters of NETWORK 262 | # hidden = None 263 | # 264 | # with trange(0, 300) as numEpoch: 265 | # for epoch in numEpoch: 266 | # for step, (batch_train, batch_target) in enumerate(loader): 267 | # batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 268 | # inputs = Variable(batch_train, requires_grad=True).to(device) 269 | # targets = Variable(batch_target).to(device) 270 | # hidden = repackage_hidden(hidden) 271 | # outputs, hidden = estimator(inputs, hidden) 272 | # loss = loss_func(outputs, targets) 273 | # optimizer.zero_grad() 274 | # loss.backward() 275 | # optimizer.step() 276 | # numEpoch.set_postfix(Loss='%0.32f' % loss) 277 | # torch.save(estimator.state_dict(), 'initial_batch_params_TS.pkl') 278 | 279 | def batch_train_params(): 280 | print('Start Initializing...') 281 | estimator.apply(weight_init) 282 | hidden = None 283 | with trange(0, 500) as numEpoch: 284 | for epoch in numEpoch: 285 | for step, (batch_train, batch_target) in enumerate(loader2): 286 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 287 | inputs = Variable(batch_train, requires_grad=True).to(device) 288 | targets = Variable(batch_target).to(device) 289 | 290 | hidden = repackage_hidden(hidden) 291 | optimizer.zero_grad() 292 | outputs, hidden = estimator(inputs, hidden) 293 | loss = loss_func(outputs, targets) 294 | loss.backward() 295 | optimizer.step() 296 | numEpoch.set_postfix(Loss='%0.8f' % loss) 297 | torch.save(estimator.state_dict(), 'initial_batch_params.pkl') 298 | [h,c] = hidden 299 | file = xlwt.Workbook() 300 | for i in range(h.shape[0]): 301 | sheetname = 'h-' + str(i) 302 | sheet = file.add_sheet(sheetname, cell_overwrite_ok=True) 303 | for j in range(h.shape[1]): 304 | for r in range(h.shape[2]): 305 | sheet.write(j, r, h[i,j,r].item()) 306 | 307 | for i in range(c.shape[0]): 308 | sheetname = 'c-' + str(i) 309 | sheet1 = file.add_sheet(sheetname, cell_overwrite_ok=True) 310 | for j in range(c.shape[1]): 311 | for r in range(c.shape[2]): 312 | sheet1.write(j, r, c[i,j,r].item()) 313 | 314 | ffilename = 'hidden.xls' 315 | file.save(ffilename) 316 | 317 | return hidden 318 | 319 | def train(): 320 | print('Start Training...') 321 | 322 | h_1 = pd.read_excel('hidden.xls', sheet_name='h-0', header=None) 323 | h_2 = pd.read_excel('hidden.xls', sheet_name='h-1', header=None) 324 | c_1 = pd.read_excel('hidden.xls', sheet_name='c-0', header=None) 325 | c_2 = pd.read_excel('hidden.xls', sheet_name='c-1', header=None) 326 | 327 | h_1 = h_1.as_matrix() 328 | h_1 = torch.from_numpy(h_1).float().to(device) 329 | h_1 = torch.unsqueeze(h_1,0) 330 | h_2 = h_2.as_matrix() 331 | h_2 = torch.from_numpy(h_2).float().to(device) 332 | h_2 = torch.unsqueeze(h_2, 0) 333 | c_1 = c_1.as_matrix() 334 | c_1 = torch.from_numpy(c_1).float().to(device) 335 | c_1 = torch.unsqueeze(c_1, 0) 336 | c_2 = c_2.as_matrix() 337 | c_2 = torch.from_numpy(c_2).float().to(device) 338 | c_2 = torch.unsqueeze(c_2, 0) 339 | 340 | h = torch.cat((h_1,h_2),dim=0) 341 | c = torch.cat((c_1, c_2), dim=0) 342 | 343 | hidden =[h,c] 344 | 345 | estimator.load_state_dict(torch.load('initial_batch_params.pkl')) 346 | scheduler = CyclicLR(optimizer, base_lr=1e-6, max_lr=1e-4, step_size=300, mode='triangular2') 347 | 348 | with trange(0, EPOCH) as numEPoch: 349 | for epoch in numEPoch: 350 | total_loss = 0 351 | scheduler.step() 352 | optimizer.zero_grad() 353 | for step, (batch_train, batch_targets) in enumerate(loader1): 354 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 355 | inputs = Variable(batch_train, requires_grad=True).to(device) 356 | targets = Variable(batch_targets).to(device) 357 | 358 | hidden = repackage_hidden(hidden) 359 | 360 | optimizer.zero_grad() 361 | outputs, hidden = estimator(inputs, hidden) 362 | Z_hat = power_flow_batch(outputs) 363 | loss = loss_func(Z_hat, targets)/iter_size 364 | total_loss += loss 365 | loss.backward() 366 | optimizer.step() 367 | numEPoch.set_postfix(Loss='%0.8f' % total_loss) # print error 368 | # print('Loss=%0.8f' % loss) 369 | torch.save(estimator.state_dict(), 'final_params.pkl') 370 | 371 | [h, c] = hidden 372 | file = xlwt.Workbook() 373 | for i in range(h.shape[0]): 374 | sheetname = 'h-' + str(i) 375 | sheet = file.add_sheet(sheetname, cell_overwrite_ok=True) 376 | for j in range(h.shape[1]): 377 | for r in range(h.shape[2]): 378 | sheet.write(j, r, h[i, j, r].item()) 379 | 380 | for i in range(c.shape[0]): 381 | sheetname = 'c-' + str(i) 382 | sheet1 = file.add_sheet(sheetname, cell_overwrite_ok=True) 383 | for j in range(c.shape[1]): 384 | for r in range(c.shape[2]): 385 | sheet1.write(j, r, c[i, j, r].item()) 386 | 387 | ffilename = 'hiddentrain.xls' 388 | file.save(ffilename) 389 | 390 | return hidden 391 | 392 | 393 | # Load streaming data 394 | stream_data = pd.read_excel(xls, sheet_name='TestData', header=None) 395 | stream_data = stream_data.as_matrix() 396 | stream_data = torch.from_numpy(stream_data).float() 397 | stream_torch_dataset = Data.TensorDataset(stream_data, stream_data) 398 | stream_loader = Data.DataLoader(dataset=stream_torch_dataset, batch_size=1, shuffle=False, 399 | num_workers=2, # sub-processes for loading data 400 | ) 401 | 402 | 403 | def pfm_test(): 404 | estimator.load_state_dict(torch.load('final_params.pkl')) 405 | 406 | h_1 = pd.read_excel('hiddentrain.xls', sheet_name='h-0', header=None) 407 | h_2 = pd.read_excel('hiddentrain.xls', sheet_name='h-1', header=None) 408 | c_1 = pd.read_excel('hiddentrain.xls', sheet_name='c-0', header=None) 409 | c_2 = pd.read_excel('hiddentrain.xls', sheet_name='c-1', header=None) 410 | 411 | h_1 = h_1.as_matrix() 412 | h_1 = torch.from_numpy(h_1).float().to(device) 413 | h_1 = torch.unsqueeze(h_1, 0) 414 | h_2 = h_2.as_matrix() 415 | h_2 = torch.from_numpy(h_2).float().to(device) 416 | h_2 = torch.unsqueeze(h_2, 0) 417 | c_1 = c_1.as_matrix() 418 | c_1 = torch.from_numpy(c_1).float().to(device) 419 | c_1 = torch.unsqueeze(c_1, 0) 420 | c_2 = c_2.as_matrix() 421 | c_2 = torch.from_numpy(c_2).float().to(device) 422 | c_2 = torch.unsqueeze(c_2, 0) 423 | 424 | h = torch.cat((h_1[:,-1,:].unsqueeze(1).contiguous(), h_2[:,-1,:].unsqueeze(1).contiguous()), dim=0) 425 | c = torch.cat((c_1[:,-1,:].unsqueeze(1).contiguous(), c_2[:,-1,:].unsqueeze(1).contiguous()), dim=0) 426 | 427 | hidden = [h, c] 428 | 429 | for param_group in optimizer.param_groups: 430 | param_group['lr'] = 1e-8 431 | print('Online Training...') 432 | file = xlwt.Workbook() 433 | 434 | for step, (batch_train, batch_targets) in enumerate(stream_loader): 435 | batch_train = batch_train.view(1, batch_train.shape[0], batch_train.shape[1]) 436 | inputs = Variable(batch_train, requires_grad=True).to(device) 437 | targets = Variable(batch_targets).to(device) 438 | 439 | hidden = repackage_hidden(hidden) 440 | 441 | outputs, hidden = estimator(inputs, hidden) 442 | Z_hat = power_flow(outputs) ###power_flow() is much faster than power_flow_batch() 443 | loss = loss_func(Z_hat, targets) 444 | if loss.item() < 5e-4: 445 | optimizer.zero_grad() 446 | loss.backward() 447 | optimizer.step() 448 | 449 | outputs = outputs.squeeze() 450 | if step > 16261: 451 | sheet = file.add_sheet(str(step), cell_overwrite_ok=True) 452 | for j in range(len(outputs)): 453 | sheet.write(j, 0, outputs[j].item()) 454 | 455 | ffilename = 'dnn-test.xls' 456 | file.save(ffilename) 457 | 458 | 459 | def main(): 460 | # hidden = batch_train_params() 461 | # hidden = train() 462 | # hidden = (hidden[0][:, -1, :].unsqueeze(1).contiguous(), hidden[1][:, -1, :].unsqueeze(1).contiguous()) 463 | pfm_test() 464 | 465 | 466 | if __name__ == "__main__": 467 | main() 468 | -------------------------------------------------------------------------------- /LSTM/IEEE14/ReadMe: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /LSTM/IEEE14/cyclic_lr_scheduler.py: -------------------------------------------------------------------------------- 1 | import math 2 | import numpy as np 3 | from torch.optim.optimizer import Optimizer 4 | 5 | 6 | class _LRScheduler(object): 7 | def __init__(self, optimizer, last_epoch=-1): 8 | if not isinstance(optimizer, Optimizer): 9 | raise TypeError('{} is not an Optimizer'.format( 10 | type(optimizer).__name__)) 11 | self.optimizer = optimizer 12 | if last_epoch == -1: 13 | for group in optimizer.param_groups: 14 | group.setdefault('initial_lr', group['lr']) 15 | else: 16 | for i, group in enumerate(optimizer.param_groups): 17 | if 'initial_lr' not in group: 18 | raise KeyError("param 'initial_lr' is not specified " 19 | "in param_groups[{}] when resuming an optimizer".format(i)) 20 | self.base_lrs = list(map(lambda group: group['initial_lr'], optimizer.param_groups)) 21 | self.step(last_epoch + 1) 22 | self.last_epoch = last_epoch 23 | 24 | def get_lr(self): 25 | raise NotImplementedError 26 | 27 | def step(self, epoch=None): 28 | if epoch is None: 29 | epoch = self.last_epoch + 1 30 | self.last_epoch = epoch 31 | for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): 32 | param_group['lr'] = lr 33 | 34 | 35 | class CyclicLR(_LRScheduler): 36 | 37 | def __init__(self, optimizer, base_lr, max_lr, step_size, gamma=0.99, mode='triangular', last_epoch=-1): 38 | self.optimizer = optimizer 39 | self.base_lr = base_lr 40 | self.max_lr = max_lr 41 | self.step_size = step_size 42 | self.gamma = gamma 43 | self.mode = mode 44 | assert mode in ['triangular', 'triangular2', 'exp_range'] 45 | super(CyclicLR, self).__init__(optimizer, last_epoch) 46 | 47 | def get_lr(self): 48 | new_lr = [] 49 | # make sure that the length of base_lrs doesn't change. Dont care about the actual value 50 | for base_lr in self.base_lrs: 51 | cycle = np.floor(1 + self.last_epoch / (2 * self.step_size)) 52 | x = np.abs(float(self.last_epoch) / self.step_size - 2 * cycle + 1) 53 | if self.mode == 'triangular': 54 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) 55 | elif self.mode == 'triangular2': 56 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) / float(2 ** (cycle - 1)) 57 | elif self.mode == 'exp_range': 58 | lr = self.base_lr + (self.max_lr - self.base_lr) * np.maximum(0, (1 - x)) * (self.gamma ** ( 59 | self.last_epoch)) 60 | new_lr.append(lr) 61 | return new_lr -------------------------------------------------------------------------------- /LSTM/IEEE14/final_params.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/LSTM/IEEE14/final_params.pkl -------------------------------------------------------------------------------- /LSTM/IEEE14/hidden.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/LSTM/IEEE14/hidden.xls -------------------------------------------------------------------------------- /LSTM/IEEE14/hiddentrain.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/LSTM/IEEE14/hiddentrain.xls -------------------------------------------------------------------------------- /LSTM/IEEE14/initial_batch_params.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/LSTM/IEEE14/initial_batch_params.pkl -------------------------------------------------------------------------------- /LSTM/IEEE14/integratedata.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import xlwt 4 | 5 | xls = pd.ExcelFile('dnn-test.xls') 6 | total = np.zeros(27) 7 | for i in range(16262, 17133): 8 | sys_data = pd.read_excel(xls, sheetname=str(i), header=None) 9 | sys_data = sys_data.squeeze() 10 | # sys_data = sys_data.as_matrix() 11 | # print(total.shape) 12 | # print(sys_data.shape) 13 | total = np.vstack((total, sys_data)) 14 | total = total[1:,:] 15 | _r, _c = total.shape 16 | file = xlwt.Workbook() 17 | sheet = file.add_sheet('Sheet1') 18 | for r in range(_r): 19 | for c in range(_c): 20 | sheet.write(r, c, total[r, c]) 21 | file.save('lstm.xls') 22 | 23 | -------------------------------------------------------------------------------- /LSTM/IEEE14/measurements.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/LSTM/IEEE14/measurements.xlsx -------------------------------------------------------------------------------- /LSTM/ReadMe: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PSSE_Code 2 | It includes WLS, WLAV (matlab) and neural network models for power system state estimation. 3 | WLS: IEEE118, the data file is too large to upload. 4 | -------------------------------------------------------------------------------- /WLAV/IEEE14WLAV.m: -------------------------------------------------------------------------------- 1 | function lav() 2 | clear all 3 | clc 4 | 5 | num = 14; 6 | zdata = xlsread('measurements.xlsx','Data'); 7 | zdata = zdata'; 8 | bpq = zeros(num,num); 9 | nbus = num; 10 | G = xlsread('measurements.xlsx','Real'); 11 | B = xlsread('measurements.xlsx','Imag'); 12 | 13 | type = zdata(:,2); 14 | fbus = zdata(:,3); % From bus.. 15 | tbus = zdata(:,4); % To bus.. 16 | Ri = diag(zdata(:,5)); % Measurement Error.. 17 | Wi = 1./zdata(:,5)'; 18 | 19 | vi = find(type == 1); % Index of voltage magnitude measurements.. 20 | ppi = find(type == 2); % Index of real power injection measurements.. 21 | qi = find(type == 3); % Index of reactive power injection measurements.. 22 | pf = find(type == 4); % Index of real powerflow measurements.. 23 | qf = find(type == 5); % Index of reactive powerflow measurements.. 24 | 25 | nvi = length(vi); % Number of Voltage measurements.. 26 | npi = length(ppi); % Number of Real Power Injection measurements.. 27 | nqi = length(qi); % Number of Reactive Power Injection measurements.. 28 | npf = length(pf); % Number of Real Power Flow measurements.. 29 | nqf = length(qf); % Number of Reactive Power Flow measurements.. 30 | 31 | iter = 1; 32 | tol = 5; 33 | 34 | msrdata = zdata(:,6:end); 35 | [num_msr,c] = size(msrdata); 36 | total=[]; 37 | 38 | for set=1:c 39 | z = msrdata(:,set); % Measuement values.. 40 | V = ones(nbus,1); % Initialize the bus voltages.. 41 | del = zeros(nbus,1); % Initialize the bus angles.. 42 | E = [del(2:end); V]; % State Vector.. 43 | NG=0; % Threshold violation.. 44 | 45 | while(tol > 1e-5 && iter <= 100) 46 | if iter == 100 47 | NG=NG+1; 48 | end 49 | 50 | %Measurement Function, h 51 | h1 = V(fbus(vi),1); 52 | h2 = zeros(npi,1); 53 | h3 = zeros(nqi,1); 54 | h4 = zeros(npf,1); 55 | h5 = zeros(nqf,1); 56 | 57 | for i = 1:npi 58 | m = fbus(ppi(i)); 59 | for k = 1:nbus 60 | h2(i) = h2(i) + V(m)*V(k)*(G(m,k)*cos(del(m)-del(k)) + B(m,k)*sin(del(m)-del(k))); 61 | end 62 | end 63 | 64 | for i = 1:nqi 65 | m = fbus(qi(i)); 66 | for k = 1:nbus 67 | h3(i) = h3(i) + V(m)*V(k)*(G(m,k)*sin(del(m)-del(k)) - B(m,k)*cos(del(m)-del(k))); 68 | end 69 | end 70 | 71 | for i = 1:npf 72 | m = fbus(pf(i)); 73 | n = tbus(pf(i)); 74 | h4(i) = -V(m)^2*G(m,n) - V(m)*V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 75 | end 76 | 77 | for i = 1:nqf 78 | m = fbus(qf(i)); 79 | n = tbus(qf(i)); 80 | h5(i) = -V(m)^2*(-B(m,n)+bpq(m,n)) - V(m)*V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 81 | end 82 | 83 | h = [h1; h2; h3; h4; h5]; 84 | 85 | % Residue.. 86 | r = z - h; 87 | 88 | % Jacobian.. 89 | % H11 - Derivative of V with respect to angles.. All Zeros 90 | H11 = zeros(nvi,nbus-1); 91 | 92 | % H12 - Derivative of V with respect to V.. 93 | H12 = zeros(nvi,nbus); 94 | for k = 1:nvi 95 | for n = 1:nbus 96 | if n == k 97 | H12(k,n) = 1; 98 | end 99 | end 100 | end 101 | 102 | % H21 - Derivative of Real Power Injections with Angles.. 103 | H21 = zeros(npi,nbus-1); 104 | for i = 1:npi 105 | m = fbus(ppi(i)); 106 | for k = 1:(nbus-1) 107 | if k+1 == m 108 | for n = 1:nbus 109 | H21(i,k) = H21(i,k) + V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 110 | end 111 | H21(i,k) = H21(i,k) - V(m)^2*B(m,m); 112 | else 113 | H21(i,k) = V(m)* V(k+1)*(G(m,k+1)*sin(del(m)-del(k+1)) - B(m,k+1)*cos(del(m)-del(k+1))); 114 | end 115 | end 116 | end 117 | 118 | % H22 - Derivative of Real Power Injections with V.. 119 | H22 = zeros(npi,nbus); 120 | for i = 1:npi 121 | m = fbus(ppi(i)); 122 | for k = 1:(nbus) 123 | if k == m 124 | for n = 1:nbus 125 | H22(i,k) = H22(i,k) + V(n)*(G(m,n)*cos(del(m)-del(n)) + B(m,n)*sin(del(m)-del(n))); 126 | end 127 | H22(i,k) = H22(i,k) + V(m)*G(m,m); 128 | else 129 | H22(i,k) = V(m)*(G(m,k)*cos(del(m)-del(k)) + B(m,k)*sin(del(m)-del(k))); 130 | end 131 | end 132 | end 133 | 134 | % H31 - Derivative of Reactive Power Injections with Angles.. 135 | H31 = zeros(nqi,nbus-1); 136 | for i = 1:nqi 137 | m = fbus(qi(i)); 138 | for k = 1:(nbus-1) 139 | if k+1 == m 140 | for n = 1:nbus 141 | H31(i,k) = H31(i,k) + V(m)* V(n)*(G(m,n)*cos(del(m)-del(n)) + B(m,n)*sin(del(m)-del(n))); 142 | end 143 | H31(i,k) = H31(i,k) - V(m)^2*G(m,m); 144 | else 145 | H31(i,k) = V(m)* V(k+1)*(-G(m,k+1)*cos(del(m)-del(k+1)) - B(m,k+1)*sin(del(m)-del(k+1))); 146 | end 147 | end 148 | end 149 | 150 | % H32 - Derivative of Reactive Power Injections with V.. 151 | H32 = zeros(nqi,nbus); 152 | for i = 1:nqi 153 | m = fbus(qi(i)); 154 | for k = 1:(nbus) 155 | if k == m 156 | for n = 1:nbus 157 | H32(i,k) = H32(i,k) + V(n)*(G(m,n)*sin(del(m)-del(n)) - B(m,n)*cos(del(m)-del(n))); 158 | end 159 | H32(i,k) = H32(i,k) - V(m)*B(m,m); 160 | else 161 | H32(i,k) = V(m)*(G(m,k)*sin(del(m)-del(k)) - B(m,k)*cos(del(m)-del(k))); 162 | end 163 | end 164 | end 165 | 166 | % H41 - Derivative of Real Power Flows with Angles.. 167 | H41 = zeros(npf,nbus-1); 168 | for i = 1:npf 169 | m = fbus(pf(i)); 170 | n = tbus(pf(i)); 171 | for k = 1:(nbus-1) 172 | if k+1 == m 173 | H41(i,k) = V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 174 | else if k+1 == n 175 | H41(i,k) = -V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 176 | else 177 | H41(i,k) = 0; 178 | end 179 | end 180 | end 181 | end 182 | 183 | % H42 - Derivative of Real Power Flows with V.. 184 | H42 = zeros(npf,nbus); 185 | for i = 1:npf 186 | m = fbus(pf(i)); 187 | n = tbus(pf(i)); 188 | for k = 1:nbus 189 | if k == m 190 | H42(i,k) = -V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))) - 2*G(m,n)*V(m); 191 | else if k == n 192 | H42(i,k) = -V(m)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 193 | else 194 | H42(i,k) = 0; 195 | end 196 | end 197 | end 198 | end 199 | 200 | % H51 - Derivative of Reactive Power Flows with Angles.. 201 | H51 = zeros(nqf,nbus-1); 202 | for i = 1:nqf 203 | m = fbus(qf(i)); 204 | n = tbus(qf(i)); 205 | for k = 1:(nbus-1) 206 | if k+1 == m 207 | H51(i,k) = -V(m)* V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 208 | else if k+1 == n 209 | H51(i,k) = V(m)* V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 210 | else 211 | H51(i,k) = 0; 212 | end 213 | end 214 | end 215 | end 216 | 217 | % H52 - Derivative of Reactive Power Flows with V.. 218 | H52 = zeros(nqf,nbus); 219 | for i = 1:nqf 220 | m = fbus(qf(i)); 221 | n = tbus(qf(i)); 222 | for k = 1:nbus 223 | if k == m 224 | H52(i,k) = -V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))) - 2*V(m)*(-B(m,n)+ bpq(m,n)); 225 | else if k == n 226 | H52(i,k) = -V(m)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 227 | else 228 | H52(i,k) = 0; 229 | end 230 | end 231 | end 232 | end 233 | 234 | % Measurement Jacobian, H.. 235 | H = [H11 H12; H21 H22; H31 H32; H41 H42; H51 H52]; 236 | 237 | 238 | %% Linear Programming (IPOPT) 239 | delta_x1 = sdpvar(2*nbus-1,1); 240 | delta_x2 = sdpvar(2*nbus-1,1); 241 | r1 = sdpvar(num_msr,1); 242 | r2 = sdpvar(num_msr,1); 243 | obj = Wi*(r1+r2); 244 | % sdisplay(obj); 245 | constraints = []; 246 | constraints = [constraints, H*delta_x1 - H*delta_x2 + r1 - r2 == r]; 247 | constraints = [constraints, delta_x1>=0, delta_x2>=0, r1>=0, r2>=0]; 248 | options = sdpsettings('solver','ipopt','verbose',0,'showprogress',0); 249 | sol = optimize(constraints,obj,options); 250 | 251 | % Analyze error flags 252 | if sol.problem ~= 0 253 | display('Hmm, something went wrong!'); 254 | sol.info 255 | yalmiperror(sol.problem) 256 | end 257 | 258 | %% Update 259 | dE = value(delta_x1 - delta_x2); 260 | residual = r1 - r2; 261 | 262 | E = E + dE; 263 | del(2:end) = E(1:nbus-1); 264 | V = E(nbus:end); 265 | iter = iter + 1; 266 | tol = max(abs(dE)); 267 | end 268 | 269 | total = horzcat(total, E); 270 | tol = 5; 271 | iter = 1; 272 | 273 | if flag == false 274 | if ii > 1 275 | ii = ii-1; 276 | else 277 | nummsr = nummsr + 1 278 | ii = 100; 279 | end 280 | break; 281 | end 282 | end 283 | end -------------------------------------------------------------------------------- /WLAV/ReadMe: -------------------------------------------------------------------------------- 1 | Using the same measurement data. 2 | -------------------------------------------------------------------------------- /WLS/IEEE118/GenerateData.m: -------------------------------------------------------------------------------- 1 | function GenerateData() 2 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 | %Following the loadprofile to get various load 4 | %runpf --> True measurements and Ybus 5 | %WGN --> Actural measurements% 6 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 | clear 8 | clc 9 | 10 | %%%%%%%%%%%%%%%%%%%%%Part I%%%%%%%%%%%%%%%%%%%%%%% 11 | % % % True measurements and Ybus 12 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 | 14 | mpc = loadcase('case118'); 15 | % Ybus1 = full(makeYbus(mpc)); 16 | mpc.branch(:,5) = 0; %line charging 17 | mpc.branch(:,9) = 0; %tap ration 18 | mpc.bus(:,5) = 0; % Gs 19 | mpc.bus(:,6) = 0; %Bs 20 | %%%%Combine the two circuits between two same nodes 21 | multi_index = []; 22 | ft = mpc.branch(:,1:2); 23 | for i = 1:length(ft)-1 24 | if ft(i,1)==ft(i+1,1) && ft(i,2)==ft(i+1,2) 25 | disp(ft(i,:)); 26 | multi_index = [multi_index;i+1]; 27 | P_z = (mpc.branch(i,3) + j*mpc.branch(i,4))*(mpc.branch(i+1,3) + j*mpc.branch(i+1,4)) /(mpc.branch(i,3) + j*mpc.branch(i,4) + mpc.branch(i+1,3) + j*mpc.branch(i+1,4)) ; 28 | mpc.branch(i,3) = real(P_z); 29 | mpc.branch(i,4) = imag(P_z); 30 | mpc.branch(i,5) = mpc.branch(i,5) + mpc.branch(i+1,5); 31 | end 32 | end 33 | 34 | mpc.branch(multi_index,:)=[];%%%%%New Branch Data%%%%% 35 | 36 | % %%%%%%%%%%%%%%%%%%%%%%Ybus%%%%%%%%%%%%%%%%%%%%%%%%% 37 | Ybus = full(makeYbus(mpc)); 38 | G_ = real(Ybus); 39 | B_ = imag(Ybus); 40 | G = full(G_); 41 | B = full(B_); 42 | 43 | xlswrite('measurements.xlsx',G, 'Real'); 44 | xlswrite('measurements.xlsx',B,'Imag'); 45 | 46 | num = 118; 47 | zdata = xlsread('measurements.xlsx','OriginalIndices'); 48 | 49 | type = zdata(:,2); % Type of measurement, Vi - 1, Pi - 2, Qi - 3, Pij - 4, Qij - 5, Iij - 6.. 50 | fbus = zdata(:,3); 51 | tbus = zdata(:,4); % To bus.. 52 | Ri = diag(zdata(:,5)); % Measurement Error.. 53 | 54 | vi = find(type == 1); % Index of voltage magnitude measurements.. 55 | ppi = find(type == 2); % Index of real power injection measurements.. 56 | qi = find(type == 3); % Index of reactive power injection measurements.. 57 | pf = find(type == 4); % Index of real powerflow measurements.. 58 | qf = find(type == 5); % Index of reactive powerflow measurements.. 59 | 60 | nvi = length(vi); % Number of Voltage measurements.. 61 | npi = length(ppi); % Number of Real Power Injection measurements.. 62 | nqi = length(qi); % Number of Reactive Power Injection measurements.. 63 | npf = length(pf); % Number of Real Power Flow measurements.. 64 | nqf = length(qf); % Number of Reactive Power Flow measurements.. 65 | 66 | % %%%%%%%%%%%%%%%%%True Measurements%%%%%%%%%%%%%%%%% 67 | ratio = xlsread('loadprofile-train', 'Sheet1'); 68 | [r,c] = size(ratio); 69 | 70 | measurements =[]; 71 | true_values = []; 72 | 73 | row=1; 74 | NG = 0; 75 | fail = 0; 76 | while row <= r 77 | disp(row) 78 | disp('****************************************'); 79 | 80 | true_v = []; 81 | true_del = []; 82 | tmp=[]; 83 | ratld = ratio(row,c); 84 | mpc = loadcase('case118'); 85 | mpc.gen(:,2) = mpc.gen(:,2); 86 | mpc.branch(:,5) = 0; % line charging 87 | mpc.branch(:,9) = 0; % tap ration 88 | mpc.bus(:,5) = 0; % Gs 89 | mpc.bus(:,6) = 0; %Bs 90 | %%%%%%%%%%%%%%%%%%%%%%Load Profile%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 91 | % mpc.gen(:,2) = ratld.*mpc.gen(:,2); 92 | mpc.bus(:,3) = ratld.*mpc.bus(:,3).*(1+(0.4*rand(num,1)-0.2)); 93 | mpc.bus(:,4) = ratld.*mpc.bus(:,4).*(1+(0.4*rand(num,1)-0.2)); 94 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 95 | msr = zeros(size(fbus,1),1); 96 | % [baseMVA, bus, gen, branch, success, et] = runpf(mpc); 97 | [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc); 98 | 99 | if min(gen(:,2)) < 0 100 | NG = NG + 1 101 | continue 102 | else 103 | Load = sum(bus(:,3)); 104 | Gen = sum(gen(:,2)); 105 | msr(vi) = bus(vi,8); 106 | 107 | for i = 1:npi 108 | if ismember(fbus(ppi(i)),gen(:,1)) 109 | index = find(gen(:,1) == fbus(ppi(i))); 110 | msr(ppi(i)) = (gen(index,2) -bus(fbus(ppi(i)),3))/baseMVA; 111 | else 112 | msr(ppi(i)) = (0-bus(fbus(ppi(i)),3))/baseMVA; 113 | end 114 | end 115 | 116 | for i = 1:nqi 117 | if ismember(fbus(qi(i)),gen(:,1)) 118 | index = find(gen(:,1) == fbus(qi(i))); 119 | msr(qi(i)) = (gen(index,3) -bus(fbus(qi(i)),4))/baseMVA; 120 | else 121 | msr(qi(i)) = (0-bus(fbus(qi(i)),4))/baseMVA; 122 | end 123 | end 124 | 125 | % find(branch(:,1)==fbus(ppi) & branch(:,2)==2 ) 126 | for i = 1:npf 127 | index = find(branch(:,1)==fbus(pf(i))& branch(:,2)==tbus(pf(i))); 128 | if length(index) == 2 129 | tmp1 = branch(index(1),14)/baseMVA; 130 | tmp2 = branch(index(2),14)/baseMVA; 131 | msr(pf(i)) = tmp1 + tmp2; 132 | elseif length(index) == 1 133 | msr(pf(i)) = branch(index,14)/baseMVA; 134 | else 135 | index = find(branch(:,2)==fbus(pf(i))& branch(:,1)==tbus(pf(i))); 136 | msr(pf(i)) = branch(index,16)/baseMVA; 137 | end 138 | end 139 | 140 | for i = 1:nqf 141 | index = find(branch(:,1)==fbus(qf(i))& branch(:,2)==tbus(qf(i))); 142 | if length(index) == 2 143 | tmp1 = branch(index(1),15)/baseMVA; 144 | tmp2 = branch(index(2),15)/baseMVA; 145 | msr(qf(i)) = tmp1 + tmp2; 146 | elseif length(index) == 1 147 | msr(qf(i)) = branch(index,15)/baseMVA; 148 | else 149 | index = find(branch(:,2)==fbus(qf(i))& branch(:,1)==tbus(qf(i))); 150 | msr(qf(i)) = branch(index,17)/baseMVA; 151 | end 152 | end 153 | 154 | [warnmsg,msgid]=lastwarn; 155 | if strcmp(msgid, 'MATLAB:nearlySingularMatrix')|strcmp(msgid, 'MATLAB:singularMatrix') 156 | lastwarn('') 157 | continue; 158 | end 159 | 160 | if success == 1 161 | row = row + 1; 162 | else 163 | fail = fail + 1; 164 | continue 165 | end 166 | 167 | del = bus(:,9)*pi/180; 168 | V = bus(:,8); 169 | measurements = horzcat(measurements, msr); 170 | true_v = horzcat(true_v, V); 171 | true_del = horzcat(true_del, del); 172 | tmp = vertcat(true_del,true_v); 173 | true_values = horzcat(true_values,tmp); 174 | end 175 | end 176 | measurements = measurements'; 177 | true_values = true_values'; 178 | xlswrite('truetraindata.xlsx',measurements, 'Sheet1'); 179 | xlswrite('truetrainstate.xlsx',true_values,'Sheet1'); 180 | 181 | [r,c] = size(measurements); 182 | sigma = sqrt(zdata(:,5)); 183 | tt = []; 184 | for col = 1:c 185 | randn(r,1); 186 | tmp = measurements(:,col) + randn(r,1)*sigma(col); %%%%Add Gaussian Noise 187 | tt = horzcat(tt,tmp); 188 | end 189 | xlswrite('actualtraindata.xlsx',tt,'Sheet1'); 190 | OriginalData= vertcat(zdata',tt); 191 | xlswrite('measurements.xlsx',OriginalData,'Original'); 192 | end -------------------------------------------------------------------------------- /WLS/IEEE118/GenerateDataTest.m: -------------------------------------------------------------------------------- 1 | function GenerateDataTest() 2 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 | %Following the loadprofile to get various load 4 | %runpf --> True measurements and Ybus 5 | %WGN --> Actural measurements% 6 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 | clear 8 | clc 9 | 10 | %%%%%%%%%%%%%%%%%%%%%Part I%%%%%%%%%%%%%%%%%%%%%%% 11 | % % % True measurements and Ybus 12 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 | 14 | mpc = loadcase('case118'); 15 | % Ybus1 = full(makeYbus(mpc)); 16 | mpc.branch(:,5) = 0; %line charging 17 | mpc.branch(:,9) = 0; %tap ration 18 | mpc.bus(:,5) = 0; % Gs 19 | mpc.bus(:,6) = 0; %Bs 20 | %%%%Combine the two circuits between two same nodes 21 | multi_index = []; 22 | ft = mpc.branch(:,1:2); 23 | for i = 1:length(ft)-1 24 | if ft(i,1)==ft(i+1,1) && ft(i,2)==ft(i+1,2) 25 | disp(ft(i,:)); 26 | multi_index = [multi_index;i+1]; 27 | P_z = (mpc.branch(i,3) + j*mpc.branch(i,4))*(mpc.branch(i+1,3) + j*mpc.branch(i+1,4)) /(mpc.branch(i,3) + j*mpc.branch(i,4) + mpc.branch(i+1,3) + j*mpc.branch(i+1,4)) ; 28 | mpc.branch(i,3) = real(P_z); 29 | mpc.branch(i,4) = imag(P_z); 30 | mpc.branch(i,5) = mpc.branch(i,5) + mpc.branch(i+1,5); 31 | end 32 | end 33 | 34 | mpc.branch(multi_index,:)=[];%%%%%New Branch Data%%%%% 35 | 36 | % %%%%%%%%%%%%%%%%%%%%%%Ybus%%%%%%%%%%%%%%%%%%%%%%%%% 37 | Ybus = full(makeYbus(mpc)); 38 | G_ = real(Ybus); 39 | B_ = imag(Ybus); 40 | G = full(G_); 41 | B = full(B_); 42 | 43 | xlswrite('measurements.xlsx',G, 'Real'); 44 | xlswrite('measurements.xlsx',B,'Imag'); 45 | 46 | num = 118; 47 | zdata = xlsread('measurements.xlsx','OriginalIndices'); 48 | 49 | type = zdata(:,2); % Type of measurement, Vi - 1, Pi - 2, Qi - 3, Pij - 4, Qij - 5, Iij - 6.. 50 | fbus = zdata(:,3); 51 | tbus = zdata(:,4); % To bus.. 52 | Ri = diag(zdata(:,5)); % Measurement Error.. 53 | 54 | vi = find(type == 1); % Index of voltage magnitude measurements.. 55 | ppi = find(type == 2); % Index of real power injection measurements.. 56 | qi = find(type == 3); % Index of reactive power injection measurements.. 57 | pf = find(type == 4); % Index of real powerflow measurements.. 58 | qf = find(type == 5); % Index of reactive powerflow measurements.. 59 | 60 | nvi = length(vi); % Number of Voltage measurements.. 61 | npi = length(ppi); % Number of Real Power Injection measurements.. 62 | nqi = length(qi); % Number of Reactive Power Injection measurements.. 63 | npf = length(pf); % Number of Real Power Flow measurements.. 64 | nqf = length(qf); % Number of Reactive Power Flow measurements.. 65 | 66 | % %%%%%%%%%%%%%%%%%True Measurements%%%%%%%%%%%%%%%%% 67 | ratio = xlsread('loadprofile-test', 'Sheet1'); 68 | [r,c] = size(ratio); 69 | 70 | measurements =[]; 71 | true_values = []; 72 | 73 | row=1; 74 | NG = 0; 75 | fail = 0; 76 | while row <= r 77 | disp(row) 78 | disp('****************************************'); 79 | 80 | true_v = []; 81 | true_del = []; 82 | tmp=[]; 83 | ratld = ratio(row,c); 84 | mpc = loadcase('case118'); 85 | mpc.gen(:,2) = mpc.gen(:,2); 86 | mpc.branch(:,5) = 0; % line charging 87 | mpc.branch(:,9) = 0; % tap ration 88 | mpc.bus(:,5) = 0; % Gs 89 | mpc.bus(:,6) = 0; %Bs 90 | %%%%%%%%%%%%%%%%%%%%%%Load Profile%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 91 | %mpc.gen(:,2) = ratld.*mpc.gen(:,2); 92 | mpc.bus(:,3) = ratld.*mpc.bus(:,3).*(1+(0.4*rand(num,1)-0.2)); 93 | mpc.bus(:,4) = ratld.*mpc.bus(:,4).*(1+(0.4*rand(num,1)-0.2)); 94 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 95 | msr = zeros(size(fbus,1),1); 96 | % [baseMVA, bus, gen, branch, success, et] = runopf(mpc); 97 | [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc); 98 | 99 | if min(gen(:,2)) < 0 100 | NG = NG + 1 101 | continue 102 | else 103 | Load = sum(bus(:,3)); 104 | Gen = sum(gen(:,2)); 105 | msr(vi) = bus(vi,8); 106 | 107 | for i = 1:npi 108 | if ismember(fbus(ppi(i)),gen(:,1)) 109 | index = find(gen(:,1) == fbus(ppi(i))); 110 | msr(ppi(i)) = (gen(index,2) -bus(fbus(ppi(i)),3))/baseMVA; 111 | else 112 | msr(ppi(i)) = (0-bus(fbus(ppi(i)),3))/baseMVA; 113 | end 114 | end 115 | 116 | for i = 1:nqi 117 | if ismember(fbus(qi(i)),gen(:,1)) 118 | index = find(gen(:,1) == fbus(qi(i))); 119 | msr(qi(i)) = (gen(index,3) -bus(fbus(qi(i)),4))/baseMVA; 120 | else 121 | msr(qi(i)) = (0-bus(fbus(qi(i)),4))/baseMVA; 122 | end 123 | end 124 | 125 | % find(branch(:,1)==fbus(ppi) & branch(:,2)==2 ) 126 | for i = 1:npf 127 | index = find(branch(:,1)==fbus(pf(i))& branch(:,2)==tbus(pf(i))); 128 | if length(index) == 2 129 | tmp1 = branch(index(1),14)/baseMVA; 130 | tmp2 = branch(index(2),14)/baseMVA; 131 | msr(pf(i)) = tmp1 + tmp2; 132 | elseif length(index) == 1 133 | msr(pf(i)) = branch(index,14)/baseMVA; 134 | else 135 | index = find(branch(:,2)==fbus(pf(i))& branch(:,1)==tbus(pf(i))); 136 | msr(pf(i)) = branch(index,16)/baseMVA; 137 | end 138 | end 139 | 140 | for i = 1:nqf 141 | index = find(branch(:,1)==fbus(qf(i))& branch(:,2)==tbus(qf(i))); 142 | if length(index) == 2 143 | tmp1 = branch(index(1),15)/baseMVA; 144 | tmp2 = branch(index(2),15)/baseMVA; 145 | msr(qf(i)) = tmp1 + tmp2; 146 | elseif length(index) == 1 147 | msr(qf(i)) = branch(index,15)/baseMVA; 148 | else 149 | index = find(branch(:,2)==fbus(qf(i))& branch(:,1)==tbus(qf(i))); 150 | msr(qf(i)) = branch(index,17)/baseMVA; 151 | end 152 | end 153 | 154 | [warnmsg,msgid]=lastwarn; 155 | if strcmp(msgid, 'MATLAB:nearlySingularMatrix')|strcmp(msgid, 'MATLAB:singularMatrix') 156 | lastwarn('') 157 | continue; 158 | end 159 | 160 | if success == 1 161 | row = row + 1; 162 | else 163 | fail = fail + 1; 164 | continue 165 | end 166 | 167 | del = bus(:,9)*pi/180; 168 | V = bus(:,8); 169 | measurements = horzcat(measurements, msr); 170 | true_v = horzcat(true_v, V); 171 | true_del = horzcat(true_del, del); 172 | tmp = vertcat(true_del,true_v); 173 | true_values = horzcat(true_values,tmp); 174 | end 175 | end 176 | measurements = measurements'; 177 | true_values = true_values'; 178 | xlswrite('truetestdata.xlsx',measurements, 'Sheet1'); 179 | xlswrite('trueteststate.xlsx',true_values,'Sheet1'); 180 | 181 | [r,c] = size(measurements); 182 | sigma = sqrt(zdata(:,5)); 183 | tt = []; 184 | for col = 1:c 185 | randn(r,1); 186 | tmp = measurements(:,col) + randn(r,1)*sigma(col); %%%%Add Gaussian Noise 187 | tt = horzcat(tt,tmp); 188 | end 189 | xlswrite('actualtestdata.xlsx',tt,'Sheet1'); 190 | end -------------------------------------------------------------------------------- /WLS/IEEE118/wls.m: -------------------------------------------------------------------------------- 1 | function wls() 2 | clear all 3 | clc 4 | 5 | num = 118; 6 | zdata = xlsread('measurements.xlsx','Original'); 7 | zdata = zdata'; 8 | 9 | bpq = zeros(num,num); 10 | nbus = num; 11 | 12 | G = xlsread('measurements.xlsx','Real'); 13 | B = xlsread('measurements.xlsx','Imag'); 14 | 15 | truestate = xlsread('truetrainstate.xlsx'); 16 | truestate = truestate(:,2:end)'; 17 | 18 | 19 | % nummsr = 359; %%total:nummsr+1 20 | % 21 | % while true 22 | % ii=100; 23 | % while ii 24 | % index = randperm(595); 25 | % index(find(index==1))=[]; 26 | % newind= index(1:nummsr); 27 | % newind= horzcat(1,newind); 28 | % newind= sort(newind); 29 | % msrdata = zdata(newind,:); 30 | 31 | 32 | 33 | nummsr = 93; %%total:nummsr+1 34 | pq = linspace(1,237,237); 35 | while true 36 | ii=100; 37 | while ii 38 | index = randperm(358); 39 | % index(find(index==1))=[]; 40 | index = index + 237; 41 | newind= index(1:nummsr); 42 | newind= horzcat(pq,newind); 43 | newind= sort(newind); 44 | msrdata = zdata(newind,:); 45 | 46 | type = msrdata(:,2); % Type of measurement, Vi - 1, Pi - 2, Qi - 3, Pij - 4, Qij - 5, Iij - 6.. 47 | fbus = msrdata(:,3); 48 | tbus = msrdata(:,4); % To bus.. 49 | Ri = diag(msrdata(:,5)); % Measurement Error.. 50 | 51 | vi = find(type == 1); % Index of voltage magnitude measurements.. 52 | ppi = find(type == 2); % Index of real power injection measurements.. 53 | qi = find(type == 3); % Index of reactive power injection measurements.. 54 | pf = find(type == 4); % Index of real powerflow measurements.. 55 | qf = find(type == 5); % Index of reactive powerflow measurements.. 56 | 57 | nvi = length(vi); % Number of Voltage measurements.. 58 | npi = length(ppi); % Number of Real Power Injection measurements.. 59 | nqi = length(qi); % Number of Reactive Power Injection measurements.. 60 | npf = length(pf); % Number of Real Power Flow measurements.. 61 | nqf = length(qf); % Number of Reactive Power Flow measurements.. 62 | 63 | iter = 1; 64 | tol = 5; 65 | 66 | msrdata1 = msrdata(:,6:end); 67 | [r,c] = size(msrdata1); 68 | total=[]; 69 | msr_rmse =[]; 70 | NG=0; 71 | badwls =[]; 72 | flag = true; 73 | for set=1:c 74 | z = msrdata1(:,set);% Measuement values.. 75 | V = ones(nbus,1); % Initialize the bus voltages.. 76 | del = 30*pi/180*ones(nbus,1); % Initialize the bus angles.. 77 | E = [del(1:68); del(70:end); V]; % #69-the reference bus 78 | 79 | disp(set); 80 | disp('*************************************************'); 81 | while(tol > 1e-5 && iter <= 100) 82 | %tic; 83 | %Measurement Function, h 84 | if iter == 100 85 | NG = NG +1; 86 | disp('ooooooooooooooooooooooooooooooooooooooooo') 87 | end 88 | h1 = V(fbus(vi),1); 89 | h2 = zeros(npi,1); 90 | h3 = zeros(nqi,1); 91 | h4 = zeros(npf,1); 92 | h5 = zeros(nqf,1); 93 | 94 | for i = 1:npi 95 | m = fbus(ppi(i)); 96 | for k = 1:nbus 97 | h2(i) = h2(i) + V(m)*V(k)*(G(m,k)*cos(del(m)-del(k)) + B(m,k)*sin(del(m)-del(k))); 98 | end 99 | end 100 | 101 | for i = 1:nqi 102 | m = fbus(qi(i)); 103 | for k = 1:nbus 104 | h3(i) = h3(i) + V(m)*V(k)*(G(m,k)*sin(del(m)-del(k)) - B(m,k)*cos(del(m)-del(k))); 105 | end 106 | end 107 | 108 | for i = 1:npf 109 | m = fbus(pf(i)); 110 | n = tbus(pf(i)); 111 | h4(i) = -V(m)^2*G(m,n) - V(m)*V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 112 | end 113 | 114 | for i = 1:nqf 115 | m = fbus(qf(i)); 116 | n = tbus(qf(i)); 117 | h5(i) = -V(m)^2*(-B(m,n)) - V(m)*V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); % 118 | end 119 | 120 | h = [h1; h2; h3; h4; h5]; 121 | 122 | % Residue.. 123 | r = z - h; 124 | 125 | % Jacobian.. 126 | % H11 - Derivative of V with respect to angles.. All Zeros 127 | H11 = zeros(nvi,nbus-1); 128 | 129 | % H12 - Derivative of V with respect to V.. 130 | H12 = zeros(nvi,nbus); 131 | for k = 1:nvi 132 | for n = 1:nbus 133 | if n == k %%This is only for the consective volatage magnitude measuremnts 134 | H12(k,n) = 1; 135 | end 136 | end 137 | end 138 | 139 | % H21 - Derivative of Real Power Injections with Angles.. 140 | H21 = zeros(npi,nbus-1); 141 | for i = 1:npi 142 | m = fbus(ppi(i)); 143 | for k = 1:68 144 | if k == m 145 | for n = 1:nbus 146 | H21(i,k) = H21(i,k) + V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 147 | end 148 | H21(i,k) = H21(i,k) - V(m)^2*B(m,m); 149 | else 150 | H21(i,k) = V(m)* V(k)*(G(m,k)*sin(del(m)-del(k)) - B(m,k)*cos(del(m)-del(k))); 151 | end 152 | end 153 | for k = 69:(nbus-1) 154 | if k+1 == m 155 | for n = 1:nbus 156 | H21(i,k) = H21(i,k) + V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 157 | end 158 | H21(i,k) = H21(i,k) - V(m)^2*B(m,m); 159 | else 160 | H21(i,k) = V(m)* V(k+1)*(G(m,k+1)*sin(del(m)-del(k+1)) - B(m,k+1)*cos(del(m)-del(k+1))); 161 | end 162 | end 163 | end 164 | 165 | % H22 - Derivative of Real Power Injections with V.. 166 | H22 = zeros(npi,nbus); 167 | for i = 1:npi 168 | m = fbus(ppi(i)); 169 | for k = 1:(nbus) 170 | if k == m 171 | for n = 1:nbus 172 | H22(i,k) = H22(i,k) + V(n)*(G(m,n)*cos(del(m)-del(n)) + B(m,n)*sin(del(m)-del(n))); 173 | end 174 | H22(i,k) = H22(i,k) + V(m)*G(m,m); 175 | else 176 | H22(i,k) = V(m)*(G(m,k)*cos(del(m)-del(k)) + B(m,k)*sin(del(m)-del(k))); 177 | end 178 | end 179 | end 180 | 181 | % H31 - Derivative of Reactive Power Injections with Angles.. 182 | H31 = zeros(nqi,nbus-1); 183 | for i = 1:nqi 184 | m = fbus(qi(i)); 185 | for k = 1:68 186 | if k == m 187 | for n = 1:nbus 188 | H31(i,k) = H31(i,k) + V(m)* V(n)*(G(m,n)*cos(del(m)-del(n)) + B(m,n)*sin(del(m)-del(n))); 189 | end 190 | H31(i,k) = H31(i,k) - V(m)^2*G(m,m); 191 | else 192 | H31(i,k) = V(m)* V(k)*(-G(m,k)*cos(del(m)-del(k)) - B(m,k)*sin(del(m)-del(k))); 193 | end 194 | end 195 | for k = 69:(nbus-1) 196 | if k+1 == m 197 | for n = 1:nbus 198 | H31(i,k) = H31(i,k) + V(m)* V(n)*(G(m,n)*cos(del(m)-del(n)) + B(m,n)*sin(del(m)-del(n))); 199 | end 200 | H31(i,k) = H31(i,k) - V(m)^2*G(m,m); 201 | else 202 | H31(i,k) = V(m)* V(k+1)*(-G(m,k+1)*cos(del(m)-del(k+1)) - B(m,k+1)*sin(del(m)-del(k+1))); 203 | end 204 | end 205 | end 206 | 207 | % H32 - Derivative of Reactive Power Injections with V.. 208 | H32 = zeros(nqi,nbus); 209 | for i = 1:nqi 210 | m = fbus(qi(i)); 211 | for k = 1:(nbus) 212 | if k == m 213 | for n = 1:nbus 214 | H32(i,k) = H32(i,k) + V(n)*(G(m,n)*sin(del(m)-del(n)) - B(m,n)*cos(del(m)-del(n))); 215 | end 216 | H32(i,k) = H32(i,k) - V(m)*B(m,m); 217 | else 218 | H32(i,k) = V(m)*(G(m,k)*sin(del(m)-del(k)) - B(m,k)*cos(del(m)-del(k))); 219 | end 220 | end 221 | end 222 | 223 | % H41 - Derivative of Real Power Flows with Angles.. 224 | H41 = zeros(npf,nbus-1); 225 | for i = 1:npf 226 | m = fbus(pf(i)); 227 | n = tbus(pf(i)); 228 | for k = 1:68 229 | if k == m 230 | H41(i,k) = V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 231 | else if k == n 232 | H41(i,k) = -V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 233 | else 234 | H41(i,k) = 0; 235 | end 236 | end 237 | end 238 | for k = 69:(nbus-1) 239 | if k+1 == m 240 | H41(i,k) = V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 241 | else if k+1 == n 242 | H41(i,k) = -V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 243 | else 244 | H41(i,k) = 0; 245 | end 246 | end 247 | end 248 | end 249 | 250 | % H42 - Derivative of Real Power Flows with V.. 251 | H42 = zeros(npf,nbus); 252 | for i = 1:npf 253 | m = fbus(pf(i)); 254 | n = tbus(pf(i)); 255 | for k = 1:nbus 256 | if k == m 257 | H42(i,k) = -V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))) - 2*G(m,n)*V(m); 258 | else if k == n 259 | H42(i,k) = -V(m)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 260 | else 261 | H42(i,k) = 0; 262 | end 263 | end 264 | end 265 | end 266 | 267 | % H51 - Derivative of Reactive Power Flows with Angles.. 268 | H51 = zeros(nqf,nbus-1); 269 | for i = 1:nqf 270 | m = fbus(qf(i)); 271 | n = tbus(qf(i)); 272 | for k = 1:68 273 | if k == m 274 | H51(i,k) = -V(m)* V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 275 | else if k == n 276 | H51(i,k) = V(m)* V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 277 | else 278 | H51(i,k) = 0; 279 | end 280 | end 281 | end 282 | for k = 69:(nbus-1) 283 | if k+1 == m 284 | H51(i,k) = -V(m)* V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 285 | else if k+1 == n 286 | H51(i,k) = V(m)* V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 287 | else 288 | H51(i,k) = 0; 289 | end 290 | end 291 | end 292 | end 293 | 294 | % H52 - Derivative of Reactive Power Flows with V.. 295 | H52 = zeros(nqf,nbus); 296 | for i = 1:nqf 297 | m = fbus(qf(i)); 298 | n = tbus(qf(i)); 299 | for k = 1:nbus 300 | if k == m 301 | H52(i,k) = -V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))) - 2*V(m)*(-B(m,n)); 302 | else if k == n 303 | H52(i,k) = -V(m)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 304 | else 305 | H52(i,k) = 0; 306 | end 307 | end 308 | end 309 | end 310 | 311 | % Measurement Jacobian, H.. 312 | H = [H11 H12; H21 H22; H31 H32; H41 H42; H51 H52]; 313 | Gm = H'*inv(Ri)*H; 314 | 315 | %Objective Function.. 316 | JJ = sum(r.^2) 317 | J = sum(inv(Ri)*r.^2); 318 | % disp(J) 319 | % State Vector.. 320 | dE = inv(Gm)*(H'*inv(Ri)*r); 321 | 322 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 323 | %%%%%%%% singular problem%%%%%%%%%%%%%% 324 | [warnmsg,msgid]=lastwarn; 325 | if strcmp(msgid, 'MATLAB:nearlySingularMatrix')||strcmp(msgid, 'MATLAB:singularMatrix') 326 | lastwarn('') 327 | flag = false; 328 | break; 329 | end 330 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 331 | 332 | E = E + dE; 333 | del(1:68) = E(1:68); 334 | del(70:end) = E(69:nbus-1); 335 | V = E(nbus:end); 336 | iter = iter + 1; 337 | tol = max(abs(dE)); 338 | end 339 | 340 | maee = mean(abs(E-truestate(:,set))); 341 | 342 | if maee > 0.1 343 | badwls = horzcat(badwls,set); 344 | end 345 | total = horzcat(total, E); 346 | tol = 5; 347 | iter = 1; 348 | 349 | if flag == false 350 | if ii > 1 351 | ii = ii-1; 352 | else 353 | nummsr = nummsr + 1 354 | ii = 100; 355 | end 356 | break; 357 | end 358 | end 359 | if set==c 360 | done = 1; 361 | break; 362 | end 363 | end 364 | if done == 1 365 | TT = total'; 366 | xlswrite('measurements.xlsx',TT,'WLS_Train'); 367 | disp(max(TT)); 368 | xlswrite('measurements.xlsx',max(TT),'MAX'); 369 | xlswrite('measurements.xlsx',newind,'indices'); 370 | xlswrite('measurements.xlsx',msrdata','Data'); 371 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 372 | %%%%%%%%%%%%%%%verify%%%%%%%%%%%%%%%%%%%%%%%% 373 | truestate = xlsread('truetrainstate.xlsx'); 374 | truestate = truestate(:,2:end); 375 | MAEE = mean(abs(truestate'-TT')); 376 | plot(MAEE) 377 | break; 378 | end 379 | end 380 | end 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | -------------------------------------------------------------------------------- /WLS/IEEE14/GenerateData.m: -------------------------------------------------------------------------------- 1 | function GenerateData() 2 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 | %Following the loadprofile to get various load 4 | %runpf --> True measurements and Ybus 5 | %WGN --> Actural measurements% 6 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 | clear 8 | clc 9 | 10 | %%%%%%%%%%%%%%%%%%%%%Part I%%%%%%%%%%%%%%%%%%%%%%% 11 | % % % True measurements and Ybus 12 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 | 14 | mpc = loadcase('case14'); 15 | % Ybus1 = full(makeYbus(mpc)); 16 | mpc.branch(:,5) = 0; %line charging 17 | mpc.branch(:,9) = 0; %tap ration 18 | mpc.bus(:,5) = 0; % Gs 19 | mpc.bus(:,6) = 0; %Bs 20 | %%%%Combine the two circuits between two same nodes 21 | multi_index = []; 22 | ft = mpc.branch(:,1:2); 23 | for i = 1:length(ft)-1 24 | if ft(i,1)==ft(i+1,1) && ft(i,2)==ft(i+1,2) 25 | disp(ft(i,:)); 26 | multi_index = [multi_index;i+1]; 27 | P_z = (mpc.branch(i,3) + j*mpc.branch(i,4))*(mpc.branch(i+1,3) + j*mpc.branch(i+1,4)) /(mpc.branch(i,3) + j*mpc.branch(i,4) + mpc.branch(i+1,3) + j*mpc.branch(i+1,4)) ; 28 | mpc.branch(i,3) = real(P_z); 29 | mpc.branch(i,4) = imag(P_z); 30 | mpc.branch(i,5) = mpc.branch(i,5) + mpc.branch(i+1,5); 31 | end 32 | end 33 | 34 | mpc.branch(multi_index,:)=[];%%%%%New Branch Data%%%%% 35 | 36 | % %%%%%%%%%%%%%%%%%%%%%%Ybus%%%%%%%%%%%%%%%%%%%%%%%%% 37 | Ybus = full(makeYbus(mpc)); 38 | G_ = real(Ybus); 39 | B_ = imag(Ybus); 40 | G = full(G_); 41 | B = full(B_); 42 | 43 | 44 | xlswrite('measurements.xlsx',G, 'Real'); 45 | xlswrite('measurements.xlsx',B,'Imag'); 46 | 47 | num = 14; 48 | zdata = xlsread('measurements.xlsx','OriginalIndices'); 49 | 50 | type = zdata(:,2); % Type of measurement, Vi - 1, Pi - 2, Qi - 3, Pij - 4, Qij - 5, Iij - 6.. 51 | fbus = zdata(:,3); 52 | tbus = zdata(:,4); % To bus.. 53 | Ri = diag(zdata(:,5)); % Measurement Error.. 54 | 55 | vi = find(type == 1); % Index of voltage magnitude measurements.. 56 | ppi = find(type == 2); % Index of real power injection measurements.. 57 | qi = find(type == 3); % Index of reactive power injection measurements.. 58 | pf = find(type == 4); % Index of real powerflow measurements.. 59 | qf = find(type == 5); % Index of reactive powerflow measurements.. 60 | 61 | nvi = length(vi); % Number of Voltage measurements.. 62 | npi = length(ppi); % Number of Real Power Injection measurements.. 63 | nqi = length(qi); % Number of Reactive Power Injection measurements.. 64 | npf = length(pf); % Number of Real Power Flow measurements.. 65 | nqf = length(qf); % Number of Reactive Power Flow measurements.. 66 | 67 | % %%%%%%%%%%%%%%%%%True Measurements%%%%%%%%%%%%%%%%% 68 | ratio = xlsread('loadprofile-train.xls', 'Sheet1'); 69 | [r,c] = size(ratio); 70 | 71 | measurements =[]; 72 | true_values = []; 73 | 74 | row=1; 75 | NG = 0; 76 | fail = 0; 77 | while row <= r 78 | disp(row) 79 | disp('****************************************'); 80 | 81 | true_v = []; 82 | true_del = []; 83 | tmp=[]; 84 | ratld = ratio(row,c); 85 | mpc = loadcase('case14'); 86 | mpc.gen(:,2) = mpc.gen(:,2); 87 | mpc.branch(:,5) = 0; % line charging 88 | mpc.branch(:,9) = 0; % tap ration 89 | mpc.bus(:,5) = 0; % Gs 90 | mpc.bus(:,6) = 0; %Bs 91 | %%%%%%%%%%%%%%%%%%%%%%Load Profile%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 92 | %mpc.gen(:,2) = ratld.*mpc.gen(:,2); 93 | mpc.bus(:,3) = ratld.*mpc.bus(:,3).*(1+(0.4*rand(num,1)-0.2)); 94 | mpc.bus(:,4) = ratld.*mpc.bus(:,4).*(1+(0.4*rand(num,1)-0.2)); 95 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 96 | msr = zeros(size(fbus,1),1); 97 | %[baseMVA, bus, gen, branch, success, et] = runpf(mpc); 98 | [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc); 99 | 100 | if success ~= 1 101 | break 102 | end 103 | 104 | if min(gen) < 0 105 | NG = NG + 1 106 | continue 107 | else 108 | 109 | Load = sum(bus(:,3)) 110 | Gen = sum(gen(:,2)) 111 | msr(vi) = bus(vi,8); 112 | 113 | 114 | for i = 1:npi 115 | if ismember(fbus(ppi(i)),gen(:,1)) 116 | index = find(gen(:,1) == fbus(ppi(i))); 117 | msr(ppi(i)) = (gen(index,2) -bus(fbus(ppi(i)),3))/baseMVA; 118 | else 119 | msr(ppi(i)) = (0-bus(fbus(ppi(i)),3))/baseMVA; 120 | end 121 | end 122 | 123 | for i = 1:nqi 124 | if ismember(fbus(qi(i)),gen(:,1)) 125 | index = find(gen(:,1) == fbus(qi(i))); 126 | msr(qi(i)) = (gen(index,3) -bus(fbus(qi(i)),4))/baseMVA; 127 | else 128 | msr(qi(i)) = (0-bus(fbus(qi(i)),4))/baseMVA; 129 | end 130 | end 131 | 132 | % find(branch(:,1)==fbus(ppi) & branch(:,2)==2 ) 133 | for i = 1:npf 134 | index = find(branch(:,1)==fbus(pf(i))& branch(:,2)==tbus(pf(i))); 135 | if length(index) == 2 136 | tmp1 = branch(index(1),14)/baseMVA; 137 | tmp2 = branch(index(2),14)/baseMVA; 138 | msr(pf(i)) = tmp1 + tmp2; 139 | elseif length(index) == 1 140 | msr(pf(i)) = branch(index,14)/baseMVA; 141 | else 142 | index = find(branch(:,2)==fbus(pf(i))& branch(:,1)==tbus(pf(i))); 143 | msr(pf(i)) = branch(index,16)/baseMVA; 144 | end 145 | end 146 | 147 | for i = 1:nqf 148 | index = find(branch(:,1)==fbus(qf(i))& branch(:,2)==tbus(qf(i))); 149 | if length(index) == 2 150 | tmp1 = branch(index(1),15)/baseMVA; 151 | tmp2 = branch(index(2),15)/baseMVA; 152 | msr(qf(i)) = tmp1 + tmp2; 153 | elseif length(index) == 1 154 | msr(qf(i)) = branch(index,15)/baseMVA; 155 | else 156 | index = find(branch(:,2)==fbus(qf(i))& branch(:,1)==tbus(qf(i))); 157 | msr(qf(i)) = branch(index,17)/baseMVA; 158 | end 159 | end 160 | 161 | if success == 1 162 | row = row + 1; 163 | else 164 | fail = fail + 1; 165 | continue 166 | end 167 | 168 | del = bus(:,9)*pi/180; 169 | V = bus(:,8); 170 | measurements = horzcat(measurements, msr); 171 | true_v = horzcat(true_v, V); 172 | true_del = horzcat(true_del, del); 173 | tmp = vertcat(true_del,true_v); 174 | true_values = horzcat(true_values,tmp); 175 | end 176 | end 177 | measurements = measurements'; 178 | true_values = true_values'; 179 | xlswrite('truetraindata.xlsx',measurements, 'Sheet1'); 180 | xlswrite('truetrainstate.xlsx',true_values,'Sheet1'); 181 | 182 | 183 | [r,c] = size(measurements); 184 | sigma = sqrt(zdata(:,5)); 185 | tt = []; 186 | for col = 1:c 187 | noise = randn(r,1)*sigma(col); 188 | tmp = measurements(:,col) + noise; 189 | tt = horzcat(tt,tmp); 190 | end 191 | xlswrite('actualtraindata.xlsx',tt,'Sheet1'); 192 | OriginalData= vertcat(zdata',tt); 193 | xlswrite('measurements.xlsx',OriginalData,'Original'); 194 | end -------------------------------------------------------------------------------- /WLS/IEEE14/GenerateDataTest.m: -------------------------------------------------------------------------------- 1 | function GenerateDataTest() 2 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 | %Following the loadprofile to get various load 4 | %runpf --> True measurements and Ybus 5 | %WGN --> Actural measurements% 6 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 | clear 8 | clc 9 | 10 | %%%%%%%%%%%%%%%%%%%%%Part I%%%%%%%%%%%%%%%%%%%%%%% 11 | % % % True measurements and Ybus 12 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 | 14 | mpc = loadcase('case14'); 15 | % Ybus1 = full(makeYbus(mpc)); 16 | mpc.branch(:,5) = 0; %line charging 17 | mpc.branch(:,9) = 0; %tap ration 18 | mpc.bus(:,5) = 0; % Gs 19 | mpc.bus(:,6) = 0; %Bs 20 | %%%%Combine the two circuits between two same nodes 21 | multi_index = []; 22 | ft = mpc.branch(:,1:2); 23 | for i = 1:length(ft)-1 24 | if ft(i,1)==ft(i+1,1) && ft(i,2)==ft(i+1,2) 25 | disp(ft(i,:)); 26 | multi_index = [multi_index;i+1]; 27 | P_z = (mpc.branch(i,3) + j*mpc.branch(i,4))*(mpc.branch(i+1,3) + j*mpc.branch(i+1,4)) /(mpc.branch(i,3) + j*mpc.branch(i,4) + mpc.branch(i+1,3) + j*mpc.branch(i+1,4)) ; 28 | mpc.branch(i,3) = real(P_z); 29 | mpc.branch(i,4) = imag(P_z); 30 | mpc.branch(i,5) = mpc.branch(i,5) + mpc.branch(i+1,5); 31 | end 32 | end 33 | 34 | mpc.branch(multi_index,:)=[];%%%%%New Branch Data%%%%% 35 | 36 | % %%%%%%%%%%%%%%%%%%%%%%Ybus%%%%%%%%%%%%%%%%%%%%%%%%% 37 | Ybus = full(makeYbus(mpc)); 38 | G_ = real(Ybus); 39 | B_ = imag(Ybus); 40 | G = full(G_); 41 | B = full(B_); 42 | 43 | 44 | % do not consider tap ratio 45 | % fb = mpc.branch(:,1); 46 | % tb = mpc.branch(:,2); 47 | % b = 0.5*mpc.branch(:,5); 48 | % nbus = max(max(fb),max(tb)); % no. of buses... 49 | % nbranch = length(fb); % no. of branches... 50 | % bbus = zeros(nbus,nbus); 51 | % 52 | % for k=1:nbranch 53 | % bbus(fb(k),tb(k)) = b(k); 54 | % bbus(tb(k),fb(k)) = bbus(fb(k),tb(k)); 55 | % end 56 | 57 | xlswrite('measurements.xlsx',G, 'Real'); 58 | xlswrite('measurements.xlsx',B,'Imag'); 59 | 60 | num = 14; 61 | zdata = xlsread('measurements.xlsx','OriginalIndices'); 62 | 63 | type = zdata(:,2); % Type of measurement, Vi - 1, Pi - 2, Qi - 3, Pij - 4, Qij - 5, Iij - 6.. 64 | fbus = zdata(:,3); 65 | tbus = zdata(:,4); % To bus.. 66 | Ri = diag(zdata(:,5)); % Measurement Error.. 67 | 68 | vi = find(type == 1); % Index of voltage magnitude measurements.. 69 | ppi = find(type == 2); % Index of real power injection measurements.. 70 | qi = find(type == 3); % Index of reactive power injection measurements.. 71 | pf = find(type == 4); % Index of real powerflow measurements.. 72 | qf = find(type == 5); % Index of reactive powerflow measurements.. 73 | 74 | nvi = length(vi); % Number of Voltage measurements.. 75 | npi = length(ppi); % Number of Real Power Injection measurements.. 76 | nqi = length(qi); % Number of Reactive Power Injection measurements.. 77 | npf = length(pf); % Number of Real Power Flow measurements.. 78 | nqf = length(qf); % Number of Reactive Power Flow measurements.. 79 | 80 | % %%%%%%%%%%%%%%%%%True Measurements%%%%%%%%%%%%%%%%% 81 | ratio = xlsread('loadprofile-test.xls', 'Sheet1'); 82 | [r,c] = size(ratio); 83 | 84 | measurements =[]; 85 | true_values = []; 86 | 87 | row=1; 88 | NG = 0; 89 | fail=0; 90 | while row <= r 91 | disp(row) 92 | disp('****************************************'); 93 | 94 | true_v = []; 95 | true_del = []; 96 | tmp=[]; 97 | ratld = ratio(row,c); 98 | mpc = loadcase('case14'); 99 | mpc.gen(:,2) = mpc.gen(:,2); 100 | mpc.branch(:,5) = 0; % line charging 101 | mpc.branch(:,9) = 0; % tap ration 102 | mpc.bus(:,5) = 0; % Gs 103 | mpc.bus(:,6) = 0; %Bs 104 | %%%%%%%%%%%%%%%%%%%%%%Load Profile%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 105 | %mpc.gen(:,2) = ratld.*mpc.gen(:,2); 106 | mpc.bus(:,3) = ratld.*mpc.bus(:,3).*(1+(0.4*rand(num,1)-0.2)); 107 | mpc.bus(:,4) = ratld.*mpc.bus(:,4).*(1+(0.4*rand(num,1)-0.2)); 108 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 109 | msr = zeros(size(fbus,1),1); 110 | %[baseMVA, bus, gen, branch, success, et] = runpf(mpc); 111 | [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc); 112 | 113 | if success ~= 1 114 | break 115 | end 116 | 117 | if min(gen) < 0 118 | NG = NG + 1 119 | continue 120 | else 121 | 122 | Load = sum(bus(:,3)) 123 | Gen = sum(gen(:,2)) 124 | msr(vi) = bus(vi,8); 125 | 126 | 127 | for i = 1:npi 128 | if ismember(fbus(ppi(i)),gen(:,1)) 129 | index = find(gen(:,1) == fbus(ppi(i))); 130 | msr(ppi(i)) = (gen(index,2) -bus(fbus(ppi(i)),3))/baseMVA; 131 | else 132 | msr(ppi(i)) = (0-bus(fbus(ppi(i)),3))/baseMVA; 133 | end 134 | end 135 | 136 | for i = 1:nqi 137 | if ismember(fbus(qi(i)),gen(:,1)) 138 | index = find(gen(:,1) == fbus(qi(i))); 139 | msr(qi(i)) = (gen(index,3) -bus(fbus(qi(i)),4))/baseMVA; 140 | else 141 | msr(qi(i)) = (0-bus(fbus(qi(i)),4))/baseMVA; 142 | end 143 | end 144 | 145 | % find(branch(:,1)==fbus(ppi) & branch(:,2)==2 ) 146 | for i = 1:npf 147 | index = find(branch(:,1)==fbus(pf(i))& branch(:,2)==tbus(pf(i))); 148 | if length(index) == 2 149 | tmp1 = branch(index(1),14)/baseMVA; 150 | tmp2 = branch(index(2),14)/baseMVA; 151 | msr(pf(i)) = tmp1 + tmp2; 152 | elseif length(index) == 1 153 | msr(pf(i)) = branch(index,14)/baseMVA; 154 | else 155 | index = find(branch(:,2)==fbus(pf(i))& branch(:,1)==tbus(pf(i))); 156 | msr(pf(i)) = branch(index,16)/baseMVA; 157 | end 158 | end 159 | 160 | for i = 1:nqf 161 | index = find(branch(:,1)==fbus(qf(i))& branch(:,2)==tbus(qf(i))); 162 | if length(index) == 2 163 | tmp1 = branch(index(1),15)/baseMVA; 164 | tmp2 = branch(index(2),15)/baseMVA; 165 | msr(qf(i)) = tmp1 + tmp2; 166 | elseif length(index) == 1 167 | msr(qf(i)) = branch(index,15)/baseMVA; 168 | else 169 | index = find(branch(:,2)==fbus(qf(i))& branch(:,1)==tbus(qf(i))); 170 | msr(qf(i)) = branch(index,17)/baseMVA; 171 | end 172 | end 173 | 174 | if success == 1 175 | row = row + 1; 176 | else 177 | fail = fail + 1; 178 | continue 179 | end 180 | 181 | del = bus(:,9)*pi/180; 182 | V = bus(:,8); 183 | measurements = horzcat(measurements, msr); 184 | true_v = horzcat(true_v, V); 185 | true_del = horzcat(true_del, del); 186 | tmp = vertcat(true_del,true_v); 187 | true_values = horzcat(true_values,tmp); 188 | end 189 | end 190 | measurements = measurements'; 191 | true_values = true_values'; 192 | xlswrite('truetestdata.xlsx',measurements, 'Sheet1'); 193 | xlswrite('trueteststate.xlsx',true_values,'Sheet1'); 194 | 195 | [r,c] = size(measurements); 196 | sigma = sqrt(zdata(:,5)); 197 | tt = []; 198 | for col = 1:c 199 | noise = randn(r,1)*sigma(col); 200 | tmp = measurements(:,col) + noise; 201 | tt = horzcat(tt,tmp); 202 | end 203 | xlswrite('actualtestdata.xlsx',tt,'Sheet1'); 204 | end -------------------------------------------------------------------------------- /WLS/IEEE14/measurements.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/WLS/IEEE14/measurements.xlsx -------------------------------------------------------------------------------- /WLS/IEEE14/wls.m: -------------------------------------------------------------------------------- 1 | function wls() %Num_Set 2 | clear all 3 | clc 4 | 5 | % Power System State Estimation using Weighted Least Square Method.. 6 | num = 14; % IEEE - 14 or IEEE - 30 bus system..(for IEEE-14 bus system replace 30 by 14)... 7 | %zdata = zdatas(num); % Get Measurement data.. 8 | zdata = xlsread('measurements.xlsx','Original'); 9 | zdata = zdata'; 10 | bpq = zeros(num,num); 11 | nbus = num; 12 | 13 | G = xlsread('measurements.xlsx','Real'); 14 | B = xlsread('measurements.xlsx','Imag'); 15 | done =0; 16 | nummsr = 29; 17 | while true 18 | ii=100; 19 | while ii 20 | index = randperm(69); 21 | index(find(index==1))=[]; 22 | newind= index(1:nummsr); 23 | newind= horzcat(1,newind); 24 | newind= sort(newind) 25 | msrdata = zdata(newind,:); 26 | 27 | type = msrdata(:,2); % Type of measurement, Vi - 1, Pi - 2, Qi - 3, Pij - 4, Qij - 5, Iij - 6.. 28 | fbus = msrdata(:,3); 29 | tbus = msrdata(:,4); % To bus.. 30 | Ri = diag(msrdata(:,5)); % Measurement Error.. 31 | 32 | vi = find(type == 1); % Index of voltage magnitude measurements.. 33 | ppi = find(type == 2); % Index of real power injection measurements.. 34 | qi = find(type == 3); % Index of reactive power injection measurements.. 35 | pf = find(type == 4); % Index of real powerflow measurements.. 36 | qf = find(type == 5); % Index of reactive powerflow measurements.. 37 | 38 | nvi = length(vi); % Number of Voltage measurements.. 39 | npi = length(ppi); % Number of Real Power Injection measurements.. 40 | nqi = length(qi); % Number of Reactive Power Injection measurements.. 41 | npf = length(pf); % Number of Real Power Flow measurements.. 42 | nqf = length(qf); % Number of Reactive Power Flow measurements.. 43 | 44 | iter = 1; 45 | tol = 5; 46 | 47 | msrdata1 = msrdata(:,6:end); 48 | [r,c] = size(msrdata1); 49 | total=[]; 50 | msr_rmse =[]; 51 | 52 | for set=1:c 53 | z = msrdata1(:,set);% Measuement values.. 54 | V = ones(nbus,1); % Initialize the bus voltages.. 55 | del = zeros(nbus,1); % Initialize the bus angles.. 56 | E = [del(2:end); V]; % State Vector.. 57 | NG=0; 58 | flag = true; 59 | while(tol > 1e-5 && iter <= 200) 60 | if iter == 200 61 | NG=NG+1; 62 | end 63 | 64 | %Measurement Function, h 65 | h1 = V(fbus(vi),1); 66 | h2 = zeros(npi,1); 67 | h3 = zeros(nqi,1); 68 | h4 = zeros(npf,1); 69 | h5 = zeros(nqf,1); 70 | 71 | for i = 1:npi 72 | m = fbus(ppi(i)); 73 | for k = 1:nbus 74 | h2(i) = h2(i) + V(m)*V(k)*(G(m,k)*cos(del(m)-del(k)) + B(m,k)*sin(del(m)-del(k))); 75 | end 76 | end 77 | 78 | for i = 1:nqi 79 | m = fbus(qi(i)); 80 | for k = 1:nbus 81 | h3(i) = h3(i) + V(m)*V(k)*(G(m,k)*sin(del(m)-del(k)) - B(m,k)*cos(del(m)-del(k))); 82 | end 83 | end 84 | 85 | for i = 1:npf 86 | m = fbus(pf(i)); 87 | n = tbus(pf(i)); 88 | h4(i) = -V(m)^2*G(m,n) - V(m)*V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 89 | end 90 | 91 | for i = 1:nqf 92 | m = fbus(qf(i)); 93 | n = tbus(qf(i)); 94 | h5(i) = -V(m)^2*(-B(m,n)+bpq(m,n)) - V(m)*V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 95 | end 96 | 97 | h = [h1; h2; h3; h4; h5]; 98 | 99 | % Residue.. 100 | r = z - h; 101 | 102 | % Jacobian.. 103 | % H11 - Derivative of V with respect to angles.. All Zeros 104 | H11 = zeros(nvi,nbus-1); 105 | 106 | % H12 - Derivative of V with respect to V.. 107 | H12 = zeros(nvi,nbus); 108 | for k = 1:nvi 109 | for n = 1:nbus 110 | if n == k 111 | H12(k,n) = 1; 112 | end 113 | end 114 | end 115 | 116 | % H21 - Derivative of Real Power Injections with Angles.. 117 | H21 = zeros(npi,nbus-1); 118 | for i = 1:npi 119 | m = fbus(ppi(i)); 120 | for k = 1:(nbus-1) 121 | if k+1 == m 122 | for n = 1:nbus 123 | H21(i,k) = H21(i,k) + V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 124 | end 125 | H21(i,k) = H21(i,k) - V(m)^2*B(m,m); 126 | else 127 | H21(i,k) = V(m)* V(k+1)*(G(m,k+1)*sin(del(m)-del(k+1)) - B(m,k+1)*cos(del(m)-del(k+1))); 128 | end 129 | end 130 | end 131 | 132 | % H22 - Derivative of Real Power Injections with V.. 133 | H22 = zeros(npi,nbus); 134 | for i = 1:npi 135 | m = fbus(ppi(i)); 136 | for k = 1:(nbus) 137 | if k == m 138 | for n = 1:nbus 139 | H22(i,k) = H22(i,k) + V(n)*(G(m,n)*cos(del(m)-del(n)) + B(m,n)*sin(del(m)-del(n))); 140 | end 141 | H22(i,k) = H22(i,k) + V(m)*G(m,m); 142 | else 143 | H22(i,k) = V(m)*(G(m,k)*cos(del(m)-del(k)) + B(m,k)*sin(del(m)-del(k))); 144 | end 145 | end 146 | end 147 | 148 | % H31 - Derivative of Reactive Power Injections with Angles.. 149 | H31 = zeros(nqi,nbus-1); 150 | for i = 1:nqi 151 | m = fbus(qi(i)); 152 | for k = 1:(nbus-1) 153 | if k+1 == m 154 | for n = 1:nbus 155 | H31(i,k) = H31(i,k) + V(m)* V(n)*(G(m,n)*cos(del(m)-del(n)) + B(m,n)*sin(del(m)-del(n))); 156 | end 157 | H31(i,k) = H31(i,k) - V(m)^2*G(m,m); 158 | else 159 | H31(i,k) = V(m)* V(k+1)*(-G(m,k+1)*cos(del(m)-del(k+1)) - B(m,k+1)*sin(del(m)-del(k+1))); 160 | end 161 | end 162 | end 163 | 164 | % H32 - Derivative of Reactive Power Injections with V.. 165 | H32 = zeros(nqi,nbus); 166 | for i = 1:nqi 167 | m = fbus(qi(i)); 168 | for k = 1:(nbus) 169 | if k == m 170 | for n = 1:nbus 171 | H32(i,k) = H32(i,k) + V(n)*(G(m,n)*sin(del(m)-del(n)) - B(m,n)*cos(del(m)-del(n))); 172 | end 173 | H32(i,k) = H32(i,k) - V(m)*B(m,m); 174 | else 175 | H32(i,k) = V(m)*(G(m,k)*sin(del(m)-del(k)) - B(m,k)*cos(del(m)-del(k))); 176 | end 177 | end 178 | end 179 | 180 | % H41 - Derivative of Real Power Flows with Angles.. 181 | H41 = zeros(npf,nbus-1); 182 | for i = 1:npf 183 | m = fbus(pf(i)); 184 | n = tbus(pf(i)); 185 | for k = 1:(nbus-1) 186 | if k+1 == m 187 | H41(i,k) = V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 188 | else if k+1 == n 189 | H41(i,k) = -V(m)* V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 190 | else 191 | H41(i,k) = 0; 192 | end 193 | end 194 | end 195 | end 196 | 197 | % H42 - Derivative of Real Power Flows with V.. 198 | H42 = zeros(npf,nbus); 199 | for i = 1:npf 200 | m = fbus(pf(i)); 201 | n = tbus(pf(i)); 202 | for k = 1:nbus 203 | if k == m 204 | H42(i,k) = -V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))) - 2*G(m,n)*V(m); 205 | else if k == n 206 | H42(i,k) = -V(m)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 207 | else 208 | H42(i,k) = 0; 209 | end 210 | end 211 | end 212 | end 213 | 214 | % H51 - Derivative of Reactive Power Flows with Angles.. 215 | H51 = zeros(nqf,nbus-1); 216 | for i = 1:nqf 217 | m = fbus(qf(i)); 218 | n = tbus(qf(i)); 219 | for k = 1:(nbus-1) 220 | if k+1 == m 221 | H51(i,k) = -V(m)* V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 222 | else if k+1 == n 223 | H51(i,k) = V(m)* V(n)*(-G(m,n)*cos(del(m)-del(n)) - B(m,n)*sin(del(m)-del(n))); 224 | else 225 | H51(i,k) = 0; 226 | end 227 | end 228 | end 229 | end 230 | 231 | % H52 - Derivative of Reactive Power Flows with V.. 232 | H52 = zeros(nqf,nbus); 233 | for i = 1:nqf 234 | m = fbus(qf(i)); 235 | n = tbus(qf(i)); 236 | for k = 1:nbus 237 | if k == m 238 | H52(i,k) = -V(n)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))) - 2*V(m)*(-B(m,n)+ bpq(m,n)); 239 | else if k == n 240 | H52(i,k) = -V(m)*(-G(m,n)*sin(del(m)-del(n)) + B(m,n)*cos(del(m)-del(n))); 241 | else 242 | H52(i,k) = 0; 243 | end 244 | end 245 | end 246 | end 247 | 248 | % Measurement Jacobian, H.. 249 | H = [H11 H12; H21 H22; H31 H32; H41 H42; H51 H52]; 250 | % Gain Matrix, Gm.. 251 | Gm = H'*inv(Ri)*H; 252 | J = sum(inv(Ri)*r.^2); 253 | 254 | % State Vector.. 255 | dE = inv(Gm)*(H'*inv(Ri)*r); 256 | 257 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 258 | %%%%%%%% singular problem%%%%%%%%%%%%%% 259 | [warnmsg,msgid]=lastwarn; 260 | if strcmp(msgid, 'MATLAB:nearlySingularMatrix')|strcmp(msgid, 'MATLAB:singularMatrix') 261 | lastwarn('') 262 | flag = false; 263 | break; 264 | end 265 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 266 | 267 | E = E + dE; 268 | del(2:end) = E(1:nbus-1); 269 | V = E(nbus:end); 270 | iter = iter + 1; 271 | tol = max(abs(dE)); 272 | end 273 | 274 | total = horzcat(total, E); 275 | tol = 5; 276 | iter = 1; 277 | 278 | if flag == false 279 | if ii > 1 280 | ii = ii-1; 281 | else 282 | nummsr = nummsr + 1 283 | ii = 100; 284 | end 285 | break; 286 | end 287 | end 288 | if set==c 289 | done = 1; 290 | break; 291 | end 292 | end 293 | if done == 1 294 | TT = total'; 295 | xlswrite('measurements.xlsx',TT,'WLS_Train'); 296 | xlswrite('measurements.xlsx',newind,'indices'); 297 | xlswrite('measurements.xlsx',msrdata','Data'); 298 | break; 299 | end 300 | end 301 | end 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /WLS/ReadMe: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /loadprofile-test.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/loadprofile-test.xls -------------------------------------------------------------------------------- /loadprofile-train.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RayUCF/PSSE_Code/6a0016cf32c3f4133256877fb485e5f087ccb2ba/loadprofile-train.xls --------------------------------------------------------------------------------