Predict Battery State of Charge Using Deep Learning
This example shows how to train a neural network to predict the state of charge of a battery by using deep learning.
Battery state of charge (SOC) is the level of charge of an electric battery relative to its capacity measured as a percentage. SOC is critical information for the vehicle energy management system and must be accurately estimated to ensure reliable and affordable electrified vehicles (xEV). However, due to the nonlinear temperature, health, and SOC dependent behavior of Li-ion batteries, SOC estimation is still a significant automotive engineering challenge. Traditional approaches to this problem, such as electrochemical models, usually require precise parameters and knowledge of the battery composition as well as its physical response. In contrast, using neural networks is a data-driven approach that requires minimal knowledge of the battery or its nonlinear behavior. [1]
This example is based on the MATLAB® script from [1]. The example trains a neural network to predict the state of charge of a Li-ion battery, given time series data representing various features of the battery such as voltage, current, temperature, and average voltage and current (over the last 500 seconds).
The training data contains a single sequence of experimental data collected while the battery powered an electric vehicle during a driving cycle with an external temperature of 25 degrees Celsius. The test data contains four sequences of experimental data collected during driving cycles at four different temperatures. This example uses the preprocessed data set LG_HG2_Prepared_Dataset_McMasterUniversity_Jan_2020
from [1]. For an example showing how use a trained neural network inside a Simulink® model to predict the SOC of a battery, see Battery State of Charge Estimation in Simulink Using Feedforward Neural Network.
Download Data
Each file in the LG_HG2_Prepared_Dataset_McMasterUniversity_Jan_2020
data set contains a time series X
of five predictors (voltage, current, temperature, average voltage, and average current) and a time series Y
of one target (SOC). Each file represents data collected at a different ambient temperature.
Specify the URL from where to download the data set. Alternatively, you can download this data set manually from https://data.mendeley.com/datasets/cp3473x7xv/3.
url = "https://data.mendeley.com/public-files/datasets/cp3473x7xv/files/ad7ac5c9-2b9e-458a-a91f-6f3da449bdfb/file_downloaded";
Set downloadFolder
to where you want to download the ZIP file and the outputFolder
to where you want to extract the ZIP file.
downloadFolder = tempdir;
outputFolder = fullfile(downloadFolder,"LGHG2@n10C_to_25degC");
Download and extract the LG_HG2_Prepared_Dataset_McMasterUniversity_Jan_2020
data set.
if ~exist(outputFolder,"dir") fprintf("Downloading LGHG2@n10C_to_25degC.zip (56 MB) ... ") filename = fullfile(downloadFolder,"LGHG2@n10C_to_25degC.zip"); websave(filename,url); unzip(filename,outputFolder) end
Prepare Training Data
For the training data, create a file datastore and specify the read function as the load
function. The load
function loads the data from the MAT file into a structure array.
folderTrain = fullfile(outputFolder,"Train");
fdsTrain = fileDatastore(folderTrain,ReadFcn=@load);
Each file in this datastore contains both the predictors X
and the targets Y
.
To create a transformed datastore dsTrain
that returns the predictor data X
and the target data Y from each file, transform the file datastore fdsTrain
.
dsTrain = transform(fdsTrain,@(data) {data.X,data.Y});
Preview the transformed datastore. The output corresponds to a sequence of predictors X
from the first file and a sequence of targets Y
from the first file.
preview(dsTrain)
ans=1×2 cell array
{5×669956 double} {1×669956 double}
Note that to input the sequence data from datastores to a deep learning network, the mini-batches of the sequences must have the same length, which usually requires padding the sequences in the datastore. In this example, padding is not necessary because the training data consists of a single sequence. For more information, see Train Network Using Out-of-Memory Sequence Data.
Prepare Test and Validation Data
For the testing data, create a file datastore and specify the read function as the load
function. The load
function loads the data from the MAT file into a structure array.
folderTest = fullfile(outputFolder,"Test");
fdsTest = fileDatastore(folderTest,ReadFcn=@load);
Each file in this datastore contains both the predictors X
and the targets Y
.
To create a transformed datastore tdsPredictorsTest
that returns only the predictor data X
from each file, transform the file datastore fdsTest
.
tdsPredictorsTest = transform(fdsTest,@(data) {data.X});
Preview the transformed datastore. The output corresponds to a single sequence of predictors X
from the first file.
preview(tdsPredictorsTest)
ans = 1×1 cell array
{5×39293 double}
To create a transformed datastore tdsTargetsTest that returns only the target data Y from each file, transform the file datastore fdsTest.
tdsTargetsTest = transform(fdsTest,@(data) {data.Y});
Preview the transformed datastore. The output corresponds to a single sequence of targets Y from the first file.
preview(tdsTargetsTest)
ans = 1×1 cell array
{[1 1.0000 1.0000 1.0000 1.0000 1.0000 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999 0.9998 0.9998 0.9998 0.9998 0.9998 0.9998 0.9997 0.9996 0.9994 0.9991 0.9989 0.9988 0.9987 0.9983 0.9982 0.9980 0.9980 0.9980 0.9980 0.9981 0.9981 0.9981 0.9981 0.9981 0.9981 0.9980 0.9980 0.9979 0.9978 0.9975 0.9972 0.9970 0.9969 0.9969 0.9969 0.9970 0.9970 0.9970 0.9970 0.9970 0.9968 0.9965 0.9962 0.9960 0.9958 0.9957 0.9956 0.9956 0.9956 0.9955 0.9954 0.9954 0.9954 0.9953 0.9953 0.9952 0.9950 0.9950 0.9950 0.9950 0.9949 0.9948 0.9947 0.9946 0.9946 0.9945 0.9944 0.9942 0.9939 0.9938 0.9936 0.9935 0.9934 0.9933 0.9932 0.9932 0.9931 0.9931 0.9930 0.9929 0.9929 0.9929 0.9929 0.9928 0.9926 0.9925 0.9924 0.9923 0.9923 0.9923 0.9923 0.9923 0.9921 0.9920 0.9918 0.9917 0.9915 0.9914 0.9914 0.9914 0.9915 0.9915 0.9916 0.9916 0.9916 0.9917 0.9917 0.9918 0.9918 0.9918 0.9918 0.9918 0.9918 0.9918 0.9918 0.9917 0.9917 0.9917 0.9917 0.9917 0.9917 0.9917 0.9917 0.9917 0.9917 0.9917 0.9916 0.9916 0.9916 0.9916 0.9916 0.9916 0.9916 0.9916 0.9916 0.9916 0.9916 0.9915 0.9915 0.9915 0.9915 0.9915 0.9915 0.9915 0.9915 0.9915 0.9915 0.9915 0.9914 0.9913 0.9911 0.9909 0.9905 0.9901 0.9898 0.9894 0.9891 0.9890 0.9891 0.9891 0.9891 0.9890 0.9889 0.9889 0.9887 0.9885 0.9886 0.9886 0.9887 0.9887 0.9888 0.9888 0.9887 0.9886 0.9884 0.9880 0.9876 0.9871 0.9864 0.9856 0.9849 0.9846 0.9840 0.9835 0.9830 0.9824 0.9818 0.9814 0.9811 0.9807 0.9806 0.9805 0.9804 0.9803 0.9801 0.9800 0.9799 0.9797 0.9795 0.9793 0.9790 0.9787 0.9783 0.9780 0.9777 0.9774 0.9770 0.9767 0.9763 0.9757 0.9752 0.9748 0.9745 0.9743 0.9741 0.9740 0.9738 0.9735 0.9732 0.9729 0.9726 0.9722 0.9720 0.9716 0.9714 0.9712 0.9710 0.9708 0.9706 0.9704 0.9702 0.9700 0.9698 0.9697 0.9696 0.9696 0.9696 0.9695 0.9694 0.9693 0.9691 0.9688 0.9686 0.9684 0.9682 0.9681 0.9681 0.9680 0.9680 0.9679 0.9677 0.9676 0.9675 0.9674 0.9672 0.9670 0.9668 0.9665 0.9662 0.9658 0.9655 0.9651 0.9646 0.9642 0.9639 0.9636 0.9634 0.9633 0.9633 0.9633 0.9634 0.9635 0.9636 0.9634 0.9633 0.9632 0.9633 0.9632 0.9630 0.9629 0.9628 0.9627 0.9625 0.9624 0.9623 0.9623 0.9623 0.9624 0.9626 0.9627 0.9628 0.9630 0.9631 0.9633 0.9634 0.9635 0.9637 0.9638 0.9639 0.9640 0.9641 0.9641 0.9641 0.9642 0.9643 0.9644 0.9646 0.9647 0.9647 0.9647 0.9648 0.9649 0.9650 0.9651 0.9652 0.9653 0.9653 0.9653 0.9653 0.9653 0.9653 0.9653 0.9653 0.9653 0.9653 0.9653 0.9653 0.9653 0.9652 0.9652 0.9652 0.9652 0.9651 0.9650 0.9648 0.9645 0.9642 0.9639 0.9635 0.9633 0.9630 0.9627 0.9624 0.9620 0.9618 0.9616 0.9614 0.9612 0.9610 0.9608 0.9607 0.9605 0.9605 0.9604 0.9603 0.9601 0.9599 0.9598 0.9597 0.9596 0.9595 0.9594 0.9593 0.9592 0.9591 0.9590 0.9590 0.9591 0.9592 0.9593 0.9594 0.9596 0.9597 0.9599 0.9600 0.9601 0.9602 0.9604 0.9605 0.9606 0.9606 0.9606 0.9606 0.9606 0.9606 0.9606 0.9606 0.9605 0.9604 0.9603 0.9600 0.9597 0.9593 0.9589 0.9585 0.9583 0.9579 0.9576 0.9574 0.9573 0.9573 0.9573 0.9573 0.9573 0.9574 0.9575 0.9577 0.9578 0.9580 0.9581 0.9582 0.9583 0.9584 0.9584 0.9584 0.9583 0.9583 0.9583 0.9583 0.9583 0.9583 0.9583 0.9583 0.9583 0.9583 0.9583 0.9582 0.9582 0.9582 0.9582 0.9582 0.9582 0.9581 0.9580 0.9579 0.9576 0.9573 0.9568 0.9563 0.9558 0.9555 0.9552 0.9547 0.9543 0.9541 0.9538 0.9537 0.9535 0.9533 0.9532 0.9531 0.9530 0.9530 0.9529 0.9528 0.9527 0.9527 0.9527 0.9526 0.9525 0.9525 0.9524 0.9523 0.9522 0.9522 0.9521 0.9520 0.9519 0.9518 0.9518 0.9517 0.9516 0.9516 0.9515 0.9515 0.9514 0.9516 0.9517 0.9519 0.9520 0.9522 0.9523 0.9525 0.9526 0.9527 0.9529 0.9530 0.9531 0.9531 0.9531 0.9531 0.9531 0.9530 0.9530 0.9530 0.9530 0.9530 0.9529 0.9528 0.9527 0.9527 0.9526 0.9525 0.9523 0.9521 0.9519 0.9517 0.9516 0.9514 0.9512 0.9511 0.9509 0.9508 0.9507 0.9506 0.9506 0.9505 0.9505 0.9504 0.9504 0.9502 0.9501 0.9501 0.9501 0.9501 0.9501 0.9500 0.9500 0.9500 0.9501 0.9503 0.9504 0.9506 0.9507 0.9508 0.9509 0.9509 0.9509 0.9509 0.9509 0.9509 0.9508 0.9508 0.9508 0.9508 0.9508 0.9508 0.9508 0.9508 0.9508 0.9508 0.9508 0.9507 0.9507 0.9506 0.9504 0.9502 0.9500 0.9499 0.9498 0.9497 0.9497 0.9496 0.9496 0.9495 0.9495 0.9495 0.9495 0.9495 0.9494 0.9494 0.9494 0.9494 0.9494 0.9493 0.9493 0.9492 0.9491 0.9490 0.9489 0.9487 0.9486 0.9486 0.9485 0.9484 0.9483 0.9482 0.9482 0.9482 0.9481 0.9480 0.9478 0.9476 0.9474 0.9473 0.9472 0.9473 0.9475 0.9476 0.9477 0.9479 0.9480 0.9481 0.9482 0.9482 0.9482 0.9482 0.9482 0.9481 0.9481 0.9481 0.9481 0.9481 0.9481 0.9481 0.9481 0.9481 0.9481 0.9481 0.9480 0.9480 0.9480 0.9480 0.9480 0.9480 0.9480 0.9480 0.9480 0.9480 0.9479 0.9479 0.9479 0.9477 0.9476 0.9474 0.9473 0.9471 0.9469 0.9466 0.9464 0.9462 0.9460 0.9458 0.9456 0.9455 0.9454 0.9454 0.9453 0.9452 0.9452 0.9451 0.9451 0.9451 0.9451 0.9453 0.9454 0.9456 0.9457 0.9458 0.9460 0.9461 0.9462 0.9462 0.9462 0.9462 0.9462 0.9462 0.9462 0.9462 0.9462 0.9462 0.9462 0.9461 0.9461 0.9461 0.9461 0.9461 0.9461 0.9461 0.9460 0.9460 0.9459 0.9458 0.9456 0.9454 0.9453 0.9452 0.9451 0.9451 0.9450 0.9448 0.9447 0.9445 0.9443 0.9442 0.9441 0.9441 0.9440 0.9439 0.9438 0.9439 0.9440 0.9441 0.9442 0.9444 0.9445 0.9446 0.9447 0.9447 0.9447 0.9447 0.9447 0.9447 0.9447 0.9446 0.9444 0.9442 0.9440 0.9438 0.9436 0.9434 0.9431 0.9428 0.9426 0.9424 0.9422 0.9421 0.9419 0.9418 0.9417 0.9416 0.9415 0.9415 0.9415 0.9415 0.9415 0.9416 0.9417 0.9418 0.9420 0.9421 0.9423 0.9424 0.9425 0.9426 0.9427 0.9428 0.9428 0.9428 0.9428 0.9427 0.9427 0.9426 0.9424 0.9422 0.9419 0.9417 0.9416 0.9414 0.9412 0.9410 0.9408 0.9405 0.9402 0.9400 0.9399 0.9398 0.9396 0.9395 0.9395 0.9395 0.9394 0.9394 0.9394 0.9393 0.9393 0.9393 0.9393 0.9392 0.9392 0.9391 0.9390 0.9390 0.9389 0.9388 0.9386 0.9383 0.9380 0.9378 0.9375 0.9374 0.9373 0.9371 0.9370 0.9369 0.9369 0.9368 0.9368 0.9367 0.9368 0.9367 0.9367 0.9367 0.9367 0.9367 0.9367 0.9367 0.9367 0.9367 0.9366 0.9366 0.9365 0.9365 0.9365 0.9364 0.9364 0.9364 0.9364 0.9365 0.9365 0.9367 0.9368 0.9370 0.9371 0.9372 0.9371 0.9370 0.9368 0.9367 0.9366 0.9365 0.9364 0.9362 0.9360 0.9358 0.9357 0.9356 0.9356 0.9355 0.9354 0.9352 0.9351 0.9350 0.9349 0.9348 0.9347 0.9347 0.9348 0.9348 0.9348 0.9349 0.9350 0.9350 0.9349 0.9348 0.9347 0.9346 0.9345 0.9343 0.9342 0.9341 0.9339 0.9338 0.9337 0.9336 0.9336 0.9336 0.9336 0.9336 0.9335 0.9335 0.9335 0.9335 0.9335 0.9334 0.9333 0.9332 0.9331 0.9331 0.9330 0.9329 0.9329 0.9329 0.9329 0.9329 0.9329 0.9328 0.9328 0.9327 0.9327 0.9327 0.9326 0.9326 0.9326 0.9326 0.9325 0.9324 0.9324 0.9325 0.9326 0.9327 0.9327 0.9327 0.9326 0.9324 0.9323 0.9322 0.9321 0.9320 0.9319 0.9318 0.9318 0.9317 0.9316 0.9316 0.9316 0.9316 0.9315 0.9315 0.9315 0.9315 0.9314 0.9313 0.9312 0.9312 0.9312 0.9312 0.9312 0.9311 0.9309 0.9308 0.9309 0.9310 0.9311 0.9313 0.9315 0.9316 0.9317 0.9319 0.9319 0.9319 0.9319 0.9319 0.9319 0.9319 0.9318 0.9316 0.9314 0.9311 0.9309 0.9307 0.9305 0.9303 0.9302 0.9300 0.9297 0.9294 0.9292 0.9290 0.9289 0.9288 0.9288 0.9288 0.9288 0.9288 0.9288 0.9288 0.9288 0.9288 0.9288 0.9288 0.9289 0.9291 0.9291 0.9290 0.9290 0.9288 0.9287 0.9287 0.9287 0.9286 0.9286 0.9286 0.9285 0.9283 0.9282 0.9281 0.9280 0.9279 0.9278 0.9278 0.9278 0.9278 0.9278 0.9278 0.9279 0.9279 0.9279 0.9279 0.9279 0.9280 0.9282 0.9283 0.9285 0.9286 0.9287 0.9287 0.9287 0.9287 0.9287 0.9287 0.9287 0.9287 0.9286 0.9286 0.9286 0.9286 0.9286 0.9286 0.9286 0.9286 0.9286 0.9286 0.9286 0.9285 0.9285 0.9285 0.9285 0.9285 0.9285 0.9285 0.9285 0.9285 0.9285 0.9285 0.9284 0.9284 0.9284 0.9284 0.9282 0.9280 0.9277 0.9274 0.9272 0.9270 0.9268 0.9266 0.9264 0.9262 0.9261 0.9259 0.9258 0.9256 0.9255 0.9254 0.9254 0.9254 0.9254 0.9254 0.9255 0.9256 0.9258 0.9258 0.9259 0.9261 0.9263 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9264 0.9265 0.9265 0.9265 0.9264 0.9264 0.9264 0.9264 0.9262 0.9261 0.9259 0.9258 0.9257 0.9255 0.9252 0.9250 0.9249 0.9248 0.9248 0.9247 0.9246 0.9245 0.9244 0.9242 0.9241 0.9240 0.9239 0.9239 0.9238 0.9237 0.9236 0.9235 0.9234 0.9233 0.9232 0.9232 0.9231 0.9231 0.9230 0.9230 0.9230 0.9229 0.9229 0.9229 0.9230 0.9230 0.9231 0.9233 0.9234 0.9236 0.9237 0.9238 0.9239 0.9241 0.9241 0.9242 0.9241 0.9241 0.9241 0.9241 0.9241 0.9241 0.9241 0.9241 0.9241 0.9241 0.9241 0.9240 0.9240 0.9240 0.9240 0.9240 0.9240 0.9239 0.9237 0.9235 0.9232 0.9228 0.9224 0.9222 0.9221 0.9221 0.9222 0.9224 0.9226 0.9227 0.9229 0.9230 0.9231 0.9231 0.9231 0.9231 0.9230 0.9230 0.9230 0.9230 0.9230 0.9230 0.9230 0.9230 0.9230 0.9230 0.9229 0.9228 0.9226 0.9225 0.9224 0.9224 0.9224 0.9223 0.9223 0.9222 0.9221 0.9220 0.9218 0.9216 0.9214 0.9213 0.9212 0.9211 0.9211 0.9211 0.9210 0.9210 0.9209 0.9208 0.9208 0.9208 0.9208 0.9207 0.9207 0.9208 0.9208 0.9208 0.9207 0.9207 0.9207 0.9207 0.9209 0.9210 0.9211 0.9213 0.9213 0.9214 0.9214 0.9214 0.9214 0.9214 0.9214 0.9214 0.9214 0.9214 0.9214 0.9214 0.9214 0.9213 0.9213 0.9213 0.9213 0.9213 0.9213 0.9213 0.9212 0.9212 0.9211 0.9210 0.9209 0.9209 0.9209 0.9209 0.9209 0.9208 0.9207 0.9204 0.9201 0.9198 0.9196 0.9195 0.9194 0.9192 0.9191 0.9190 0.9189 0.9189 0.9189 0.9189 0.9189 0.9188 0.9188 0.9187 0.9187 0.9186 0.9185 0.9184 0.9183 0.9182 0.9181 0.9181 0.9180 0.9179 0.9178 0.9176 0.9174 0.9173 0.9171 0.9171 0.9170 0.9172 0.9174 0.9176 0.9177 0.9179 0.9181 0.9182 0.9183 0.9183 0.9183 0.9183 0.9183 0.9183 0.9183 0.9182 0.9182 0.9182 0.9182 0.9182 0.9182 0.9182 0.9182 0.9182 0.9182 0.9182 0.9181 0.9181 0.9181 0.9181 0.9181 0.9181 0.9181 0.9181 0.9181 0.9180 0.9180 0.9178 0.9176 0.9174 0.9173 0.9171 0.9169 0.9167 0.9166 0.9164 0.9163 0.9163 0.9162 0.9162 0.9162 0.9162 0.9163 0.9163 0.9163 0.9164 0.9164 0.9165 0.9165 0.9166 0.9168 0.9169 0.9170 0.9170 0.9170 0.9170 0.9170 0.9170 0.9170 0.9170 0.9170 0.9169 0.9169 0.9169 0.9169 0.9169 0.9169 0.9169 0.9169 0.9169 0.9169 0.9169 0.9168 0.9168 0.9168 0.9168 0.9168 0.9168 0.9167 0.9166 0.9165 0.9163 0.9160 0.9158 0.9158 0.9156 0.9153 0.9151 0.9150 0.9150 0.9150 0.9150 0.9150 0.9151 0.9152 0.9153 0.9154 0.9154 0.9153 0.9153 0.9152 0.9150 0.9147 0.9145 0.9143 0.9142 0.9142 0.9142 0.9143 0.9145 0.9146 0.9147 0.9146 0.9144 0.9141 0.9138 0.9136 0.9134 0.9133 0.9132 0.9132 0.9132 0.9131 0.9131 0.9130 0.9130 0.9129 0.9129 0.9128 0.9127 0.9126 0.9126 0.9126 0.9125 0.9124 0.9123 0.9123 0.9122 0.9121 0.9120 0.9118 0.9115 0.9114 0.9112 0.9111 0.9110 0.9109 0.9108 0.9108 0.9107 0.9107 0.9106 0.9105 0.9105 0.9105 0.9105 0.9104 0.9102 0.9101 0.9100 0.9099 0.9099 0.9099 0.9099 0.9098 0.9097 0.9096 0.9094 0.9092 0.9091 0.9090 0.9090 0.9091 0.9093 0.9095 0.9097 0.9099 0.9101 0.9102 0.9104 0.9105 0.9105 0.9105 0.9105 0.9105 0.9105 0.9105 0.9105 0.9105 0.9104 0.9104 0.9104 0.9104 0.9104 0.9104 0.9104 0.9104 0.9104 0.9104 0.9104 0.9103 0.9103 0.9103 0.9103 0.9103 0.9103 0.9103 0.9103 0.9103 0.9103 0.9103 0.9102 0.9102 0.9102 0.9102 0.9102 0.9102 0.9102 0.9102 0.9102 0.9102 0.9101 0.9100 0.9098 0.9095 0.9092 0.9088 0.9084 0.9081 0.9078 0.9078 0.9078 0.9078 0.9078 0.9077 0.9076 0.9076 0.9074 0.9072 0.9073 0.9075 0.9077 0.9079 0.9079 0.9079 0.9078 0.9077 0.9074 0.9071 0.9066 0.9061 0.9054 0.9046 0.9040 0.9036 0.9030 0.9026 0.9020 0.9015 0.9009 0.9005 0.9002 0.8999 0.8997 0.8996 0.8995 0.8994 0.8993 0.8991 0.8990 0.8988 0.8986 0.8984 0.8981 0.8978 0.8974 0.8971 0.8968 0.8965 0.8962 0.8958 0.8953 0.8948 0.8943 0.8939 0.8937 0.8934 0.8933 0.8932 0.8929 0.8927 0.8923 0.8920 0.8917 0.8914 0.8911 0.8908 0.8905 0.8903 0.8902 0.8899 0.8897 0.8895 0.8893 0.8891 0.8889 0.8888 0.8888 0.8888 0.8887 0.8887 0.8886 0.8884 0.8882 0.8880 0.8877 0.8875 0.8874 0.8873 0.8872 0.8872 0.8871 0.8870 0.8868 0.8868 0.8866 0.8865 0.8864 0.8861 0.8859 0.8856 0.8853 0.8849 0.8846 0.8841 0.8837 0.8833 0.8830 0.8827 0.8825 0.8824 0.8824 0.8825 0.8826 0.8827 0.8827 0.8825 0.8824 0.8824 0.8824 0.8823 0.8821 0.8820 0.8820 0.8818 0.8817 0.8815 0.8815 0.8815 0.8815 0.8816 0.8818 0.8819 0.8821 0.8822 0.8823 0.8825 0.8828 0.8830 0.8832 0.8833 0.8835 0.8836 0.8836 0.8836 0.8836 0.8837 0.8839 0.8842 0.8844 0.8845 0.8846 0.8846 0.8847 0.8848 0.8850 0.8851 0.8852 0.8853 0.8853 0.8853 0.8853 0.8853 0.8853 0.8852 0.8852 0.8852 0.8852 0.8852 0.8852 0.8852 0.8852 0.8852 0.8852 0.8851 0.8851 0.8849 0.8847 0.8844 0.8841 0.8837 0.8834 0.8832 0.8829 0.8826 0.8823 0.8819 0.8817 0.8815 0.8813 0.8811 0.8809 0.8807 0.8806 0.8804 0.8804 0.8803 0.8802 0.8799 0.8798 0.8797 0.8796 0.8795 0.8794 0.8793 0.8792 0.8791 0.8790 0.8789 0.8790 0.8791 0.8791 0.8793 0.8795 0.8798 0.8801 0.8804 0.8806 0.8808 0.8810 0.8811 0.8813 0.8813 0.8814 0.8814 0.8814 0.8814 0.8814 0.8813 0.8813 0.8813 0.8812 0.8810 0.8807 0.8804 0.8800 0.8795 0.8792 0.8790 0.8786 0.8783 0.8781 0.8781 0.8780 0.8780 0.8780 0.8781 0.8782 0.8785 0.8788 0.8790 0.8792 0.8794 0.8796 0.8796 0.8797 0.8797 0.8796 0.8796 0.8796 0.8796 0.8796 0.8796 0.8796 0.8796 0.8796 0.8796 0.8796 0.8795 0.8795 0.8795 0.8795 0.8795 0.8795 0.8795 0.8794 0.8793 0.8791 0.8788 0.8785 0.8780 0.8775 0.8770 0.8767 0.8764 0.8759 0.8756 0.8753 0.8751 0.8749 0.8747 0.8746 0.8745 0.8744 0.8743 0.8743 0.8742 0.8741 0.8740 0.8740 0.8739 0.8739 0.8738 0.8737 0.8737 0.8736 0.8735 0.8734 0.8734 0.8733 0.8732 0.8731 0.8730 0.8730 0.8729 0.8728 0.8728 0.8728 0.8727 0.8729 0.8731 0.8733 0.8735 0.8738 0.8741 0.8743 0.8746 0.8748 0.8749 0.8750 0.8750 0.8751 0.8751 0.8750 0.8750 0.8750 0.8750 0.8750 0.8750 0.8749 0.8749 0.8748 0.8747 0.8746 0.8746 0.8744 0.8742 0.8740 0.8738 0.8737 0.8735 0.8733 0.8732 0.8730 0.8729 0.8727 0.8726 0.8726 0.8725 0.8725 0.8724 0.8724 0.8723 0.8722 0.8721 0.8721 0.8721 0.8721 0.8720 0.8720 0.8720 0.8720 0.8722 0.8725 0.8727 0.8729 0.8731 0.8732 0.8732 0.8732 0.8732 0.8732 0.8732 0.8732 0.8732 0.8732 0.8732 0.8731 0.8731 0.8731 0.8731 0.8731 0.8731 0.8731 0.8731 0.8731 0.8730 0.8729 0.8727 0.8725 0.8723 0.8722 0.8721 0.8720 0.8720 0.8719 0.8719 0.8718 0.8718 0.8718 0.8718 0.8718 0.8717 0.8717 0.8717 0.8717 0.8717 0.8716 0.8716 0.8715 0.8714 0.8713 0.8712 0.8710 0.8709 0.8709 0.8708 0.8707 0.8706 0.8705 0.8705 0.8705 0.8704 0.8703 0.8701 0.8698 0.8697 0.8696 0.8695 0.8697 0.8699 0.8702 0.8704 0.8706 0.8708 0.8709 0.8709 0.8709 0.8709 0.8709 0.8709 0.8709 0.8709 0.8709 0.8709 0.8708 0.8708 0.8708 0.8708 0.8708 0.8708 0.8708 0.8708 0.8708 0.8708 0.8708 0.8707 0.8707 0.8707 0.8707 0.8707 0.8707 0.8707 0.8706 0.8706 0.8704 0.8703 0.8701 0.8700 0.8698 0.8695 0.8693 0.8691 0.8689 0.8687 0.8685 0.8683 0.8682 0.8681 0.8681 0.8680 0.8680 0.8679 0.8678 0.8678 0.8678 0.8679 0.8681 0.8683 0.8685 0.8686 0.8688 0.8689 0.8690 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8691 0.8690 0.8690 0.8690 0.8690 0.8690 0.8689 0.8688 0.8687 0.8685 0.8683 0.8682 0.8681 0.8680 0.8680 0.8679 0.8677 0.8676 0.8674 0.8672 0.8671 0.8671 0.8670 0.8669 0.8668 0.8668 0.8669 0.8669 0.8671 0.8673 0.8675 0.8676 0.8677 0.8678 0.8678 0.8679 0.8679 0.8678 0.8678 0.8678 0.8676 0.8675 0.8673 0.8671 0.8669 0.8667 0.8664 0.8662 0.8659 0.8657 0.8655 0.8653 0.8651 0.8650 0.8649 0.8648 0.8647 0.8646 0.8646 0.8646 0.8646 0.8646 0.8647 0.8648 0.8650 0.8652 0.8654 0.8656 0.8657 0.8658 0.8659 0.8660 0.8661 0.8661 0.8661 0.8661 0.8660 0.8660 0.8659 0.8657 0.8654 0.8652 0.8650 0.8648 0.8647 0.8645 0.8643 0.8640 0.8637 0.8635 0.8633 0.8631 0.8630 0.8629 0.8628 0.8628 0.8628 0.8627 0.8627 0.8627 0.8626 0.8626 0.8626 0.8626 0.8625 0.8624 0.8624 0.8623 0.8623 0.8622 0.8621 0.8618 0.8615 0.8613 0.8610 0.8608 0.8607 0.8605 0.8604 0.8602 0.8602 0.8601 0.8601 0.8600 0.8600 0.8600 0.8600 0.8600 0.8600 0.8600 0.8600 0.8600 0.8600 0.8600 0.8600 0.8599 0.8598 0.8598 0.8598 0.8597 0.8597 0.8597 0.8597 0.8597 0.8598 0.8599 0.8600 0.8602 0.8603 0.8604 0.8605 0.8604 0.8603 0.8601 0.8600 0.8599 0.8598 0.8597 0.8595 0.8593 0.8591 0.8590 0.8589 0.8589 0.8588 0.8587 0.8585 0.8584 0.8583 0.8582 0.8581 0.8580 0.8580 0.8581 0.8581 0.8582 0.8583 0.8583 0.8583 0.8582 0.8581 0.8580 0.8579 0.8578 0.8576 0.8575 0.8574 0.8572 0.8571 0.8570 0.8570 0.8569 0.8569 0.8569 0.8569 0.8568 0.8568 0.8568 0.8568 0.8568 0.8567 0.8566 0.8565 0.8564 0.8564 0.8563 0.8562 0.8562 0.8562 0.8562 0.8562 0.8562 0.8561 0.8561 0.8560 0.8560 0.8560 0.8559 0.8559 0.8559 0.8558 0.8558 0.8557 0.8558 0.8558 0.8559 0.8560 0.8560 0.8560 0.8559 0.8557 0.8556 0.8555 0.8554 0.8553 0.8552 0.8551 0.8551 0.8550 0.8549 0.8549 0.8549 0.8549 0.8548 0.8548 0.8548 0.8548 0.8547 0.8546 0.8545 0.8545 0.8545 0.8545 0.8544 0.8543 0.8542 0.8541 0.8542 0.8543 0.8545 0.8547 0.8549 0.8551 0.8553 0.8554 0.8554 0.8555 0.8554 0.8554 0.8554 0.8554 0.8553 0.8551 0.8548 0.8546 0.8543 0.8542 0.8540 0.8538 0.8537 0.8534 0.8531 0.8528 0.8526 0.8525 0.8524 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8524 0.8525 0.8526 0.8526 0.8525 0.8524 0.8523 0.8522 0.8522 0.8521 0.8521 0.8521 0.8520 0.8519 0.8518 0.8517 0.8516 0.8515 0.8514 0.8513 0.8513 0.8512 0.8513 0.8513 0.8513 0.8514 0.8514 0.8514 0.8514 0.8514 0.8516 0.8518 0.8520 0.8522 0.8523 0.8523 0.8524 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8523 0.8522 0.8522 0.8522 0.8522 0.8522 0.8522 0.8522 0.8522 0.8522 0.8522 0.8521 0.8521 0.8521 0.8521 0.8521 0.8521 0.8521 0.8521 0.8521 0.8520 0.8518 0.8516 0.8513 0.8510 0.8508 0.8506 0.8504 0.8502 0.8500 0.8498 0.8497 0.8495 0.8494 0.8492 0.8491 0.8490 0.8490 0.8491 0.8491 0.8490 0.8492 0.8493 0.8495 0.8495 0.8497 0.8499 0.8501 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8502 0.8503 0.8503 0.8503 0.8502 0.8502 0.8502 0.8501 0.8500 0.8498 0.8496 0.8495 0.8494 0.8492 0.8490 0.8488 0.8486 0.8486 0.8485 0.8485 0.8484 0.8482 0.8481 0.8480 0.8478 0.8477 0.8477 0.8477 0.8476 0.8475 0.8474 0.8473 0.8472 0.8471 0.8470 0.8469 0.8469 0.8468 0.8468 0.8467 0.8467 0.8467 0.8467 0.8467 0.8467 0.8468 0.8469 0.8471 0.8472 0.8474 0.8475 0.8476 0.8478 0.8479 0.8480 0.8480 0.8480 0.8480 0.8479 0.8479 0.8479 0.8479 0.8479 0.8479 0.8479 0.8479 0.8479 0.8479 0.8479 0.8478 0.8478 0.8478 0.8478 0.8477 0.8475 0.8472 0.8469 0.8465 0.8462 0.8460 0.8459 0.8460 0.8461 0.8463 0.8466 0.8467 0.8469 0.8470 0.8470 0.8470 0.8470 0.8470 0.8470 0.8470 0.8470 0.8470 0.8470 0.8470 0.8470 0.8470 0.8469 0.8469 0.8468 0.8467 0.8465 0.8464 0.8463 0.8463 0.8463 0.8463 0.8462 0.8462 0.8461 0.8459 0.8457 0.8455 0.8454 0.8452 0.8451 0.8450 0.8450 0.8450 0.8450 0.8449 0.8448 0.8448 0.8448 0.8448 0.8447 0.8447 0.8447 0.8448 0.8448 0.8448 0.8447 0.8446 0.8446 0.8447 0.8448 0.8450 0.8451 0.8452 0.8453 0.8454 0.8454 0.8454 0.8454 0.8454 0.8454 0.8454 0.8454 0.8453 0.8453 0.8453 0.8453 0.8453 0.8453 0.8453 0.8453 0.8453 0.8452 0.8452 0.8452 0.8451 0.8451 0.8450 0.8449 0.8449 0.8449 0.8449 0.8449 0.8448 0.8446 0.8443 0.8440 0.8437 0.8435 0.8434 0.8433 0.8432 0.8430 0.8429 0.8428 0.8428 0.8428 0.8428 0.8428 0.8428 0.8427 0.8427 0.8426 0.8425 0.8424 0.8423 0.8422 0.8421 0.8421 0.8420 0.8419 0.8418 0.8417 0.8415 0.8413 0.8412 0.8410 0.8410 0.8410 0.8412 0.8415 0.8417 0.8420 0.8422 0.8424 0.8425 0.8426 0.8426 0.8426 0.8426 0.8426 0.8426 0.8425 0.8425 0.8425 0.8425 0.8425 0.8425 0.8425 0.8425 0.8425 0.8425 0.8425 0.8424 0.8424 0.8424 0.8424 0.8424 0.8424 0.8424 0.8424 0.8424 0.8424 0.8423 0.8422 0.8420 0.8419 0.8417 0.8415 0.8413 0.8411 0.8410 0.8408 0.8407 0.8406 0.8405 0.8405 0.8405 0.8405 0.8405 0.8406 0.8406 0.8406 0.8407 0.8407 0.8408 0.8409 0.8410 0.8411 0.8412 0.8413 0.8413 0.8413 0.8413 0.8413 0.8413 0.8413 0.8413 0.8412 0.8412 0.8412 0.8412 0.8412 0.8412 0.8412 0.8412 0.8412 0.8412 0.8411 0.8411 0.8411 0.8411 0.8411 0.8411 0.8411 0.8411 0.8410 0.8409 0.8407 0.8405 0.8403 0.8401 0.8400 0.8398 0.8395 0.8394 0.8393 0.8392 0.8393 0.8393 0.8393 0.8393 0.8395 0.8397 0.8397 0.8397 0.8396 0.8395 0.8394 0.8392 0.8390 0.8387 0.8386 0.8385 0.8385 0.8385 0.8387 0.8388 0.8389 0.8390 0.8388 0.8386 0.8383 0.8381 0.8378 0.8377 0.8376 0.8375 0.8375 0.8375 0.8374 0.8374 0.8373 0.8373 0.8372 0.8371 0.8370 0.8369 0.8369 0.8369 0.8369 0.8368 0.8367 0.8366 0.8365 0.8365 0.8363 0.8362 0.8360 0.8357 0.8356 0.8354 0.8353 0.8352 0.8351 0.8351 0.8350 0.8350 0.8349 0.8348 0.8348 0.8348 0.8348 0.8347 0.8346 0.8344 0.8343 0.8342 0.8342 0.8342 0.8342 0.8342 0.8341 0.8339 0.8338 0.8336 0.8334 0.8333 0.8332 0.8332 0.8334 0.8337 0.8339 0.8342 0.8345 0.8347 0.8349 0.8350 0.8351 0.8351 0.8351 0.8351 0.8351 0.8351 0.8351 0.8351 0.8350 0.8350 0.8350 0.8350 0.8350 0.8350 0.8350 0.8350 0.8350 0.8350 0.8350 0.8349 0.8349 0.8349 0.8349 0.8349 0.8349 0.8349 0.8349 0.8349 0.8349 0.8349 0.8348 0.8348 0.8348 0.8348 0.8348 0.8348 0.8348 0.8348 0.8348 0.8348 0.8347 0.8347 0.8345 0.8343 0.8340 0.8336 0.8333 0.8329 0.8326 0.8324 0.8323 0.8324 0.8324 0.8324 0.8323 0.8322 0.8321 0.8319 0.8318 0.8320 0.8321 0.8323 0.8325 0.8326 0.8325 0.8324 0.8323 0.8320 0.8317 0.8312 0.8306 0.8299 0.8291 0.8286 0.8281 0.8276 0.8271 0.8265 0.8260 0.8255 0.8251 0.8247 0.8245 0.8243 0.8242 0.8241 0.8240 0.8239 0.8237 0.8236 0.8234 0.8232 0.8229 0.8226 0.8223 0.8220 0.8217 0.8213 0.8210 0.8206 0.8203 0.8198 0.8192 0.8188 0.8184 0.8182 0.8180 0.8178 0.8177 0.8174 0.8171 0.8168 0.8165 0.8162 0.8158 0.8155 0.8152 0.8150 0.8148 0.8146 0.8144 0.8142 0.8140 0.8138 0.8136 0.8134 0.8133 0.8133 0.8133 0.8132 0.8131 0.8130 0.8129 0.8127 0.8124 0.8122 0.8120 0.8118 0.8117 0.8117 0.8116 0.8116 0.8114 0.8113 0.8112 0.8111 0.8109 0.8108 0.8106 0.8103 0.8100 0.8097 0.8093 0.8089 0.8084 0.8080 0.8077 0.8073 0.8071 0.8069 0.8068 0.8068 0.8069 0.8070 0.8071 0.8071 0.8069 0.8068 0.8068 0.8068 0.8066 0.8065 0.8064 0.8063 0.8062 0.8060 0.8059 0.8059 0.8059 0.8059 0.8060 0.8062 0.8063 0.8065 0.8066 0.8068 0.8070 0.8072 0.8074 0.8076 0.8078 0.8079 0.8080 0.8080 0.8080 0.8081 0.8082 0.8084 0.8087 0.8089 0.8090 0.8090 0.8091 0.8092 0.8093 0.8094 0.8095 0.8096 0.8097 0.8097 0.8097 0.8097 0.8097 0.8097 0.8097 0.8097 0.8096 0.8096 0.8096 0.8096 0.8096 0.8096 0.8096 0.8096 0.8095 0.8094 0.8093 0.8090 0.8087 0.8084 0.8080 0.8077 0.8075 0.8072 0.8069 0.8066 0.8063 0.8061 0.8059 0.8057 0.8054 0.8052 0.8050 0.8049 0.8048 0.8047 0.8047 0.8045 0.8042 0.8041 0.8040 0.8039 0.8038 0.8038 0.8037 0.8035 0.8034 0.8033 0.8033 0.8033 0.8034 0.8035 0.8037 0.8039 0.8042 0.8045 0.8048 0.8050 0.8052 0.8054 0.8055 0.8057 0.8057 0.8058 0.8058 0.8057 0.8057 0.8057 0.8057 0.8057 0.8056 0.8055 0.8053 0.8050 0.8047 0.8042 0.8038 0.8035 0.8032 0.8029 0.8026 0.8024 0.8024 0.8023 0.8023 0.8024 0.8024 0.8026 0.8029 0.8032 0.8034 0.8036 0.8038 0.8039 0.8040 0.8040 0.8040 0.8040 0.8040 0.8040 0.8040 0.8040 0.8039 0.8039 0.8039 0.8039 0.8039 0.8039 0.8039 0.8039 0.8039 0.8039 0.8038 0.8038 0.8038 0.8037 0.8036 0.8034 0.8031 0.8027 0.8022 0.8017 0.8013 0.8010 0.8005 0.8001 0.7998 0.7995 0.7993 0.7991 0.7989 0.7988 0.7987 0.7986 0.7986 0.7985 0.7984 0.7983 0.7983 0.7982 0.7982 0.7981 0.7981 0.7980 0.7979 0.7978 0.7977 0.7977 0.7976 0.7975 0.7974 0.7973 0.7973 0.7972 0.7971 0.7971 0.7970 0.7970 0.7970 0.7972 0.7974 0.7976 0.7979 0.7981 0.7984 0.7987 0.7989 0.7991 0.7992 0.7993 0.7993 0.7993 0.7993 0.7993 0.7993 0.7993 0.7993 0.7993 0.7993 0.7992 0.7991 0.7991 0.7990 0.7989 0.7988 0.7986 0.7984 0.7982 0.7981 0.7979 0.7977 0.7976 0.7974 0.7972 0.7971 0.7969 0.7969 0.7968 0.7968 0.7967 0.7967 0.7966 0.7965 0.7964 0.7963 0.7963 0.7963 0.7963 0.7963 0.7962 0.7962 0.7963 0.7965 0.7968 0.7970 0.7972 0.7973 0.7974 0.7975 0.7975 0.7975 0.7975 0.7974 0.7974 0.7974 0.7974 0.7974 0.7974 0.7974 0.7974 0.7974 0.7974 0.7974 0.7973 0.7973 0.7973 0.7972 0.7971 0.7969 0.7967 0.7965 0.7964 0.7963 0.7963 0.7962 0.7962 0.7961 0.7961 0.7961 0.7961 0.7961 0.7960 0.7960 0.7960 0.7960 0.7959 0.7959 0.7959 0.7958 0.7957 0.7956 0.7955 0.7954 0.7952 0.7951 0.7951 0.7950 0.7949 0.7948 0.7948 0.7947 0.7947 0.7946 0.7945 0.7942 0.7940 0.7939 0.7937 0.7937 0.7939 0.7942 0.7945 0.7947 0.7949 0.7950 0.7951 0.7952 0.7952 0.7951 0.7951 0.7951 0.7951 0.7951 0.7951 0.7951 0.7951 0.7951 0.7951 0.7950 0.7950 0.7950 0.7950 0.7950 0.7950 0.7950 0.7950 0.7950 0.7950 0.7950 0.7949 0.7949 0.7949 0.7949 0.7949 0.7948 0.7946 0.7945 0.7943 0.7942 0.7939 0.7937 0.7934 0.7932 0.7930 0.7928 0.7926 0.7925 0.7924 0.7923 0.7922 0.7922 0.7921 0.7920 0.7920 0.7920 0.7920 0.7921 0.7923 0.7926 0.7927 0.7929 0.7930 0.7932 0.7933 0.7933 0.7934 0.7934 0.7934 0.7933 0.7933 0.7933 0.7933 0.7933 0.7933 0.7933 0.7933 0.7933 0.7933 0.7933 0.7932 0.7932 0.7932 0.7932 0.7931 0.7930 0.7928 0.7927 0.7925 0.7924 0.7923 0.7922 0.7922 0.7920 0.7919 0.7917 0.7915 0.7913 0.7913 0.7913 0.7912 0.7911 0.7910 0.7910 0.7911 0.7911 0.7913 0.7915 0.7917 0.7918 0.7920 0.7920 0.7920 0.7920 0.7920 0.7920 0.7920 0.7919 0.7918 0.7916 0.7914 0.7912 0.7910 0.7908 0.7905 0.7903 0.7900 0.7898 0.7896 0.7894 0.7892 0.7891 0.7890 0.7889 0.7888 0.7888 0.7888 0.7887 0.7887 0.7888 0.7889 0.7890 0.7892 0.7894 0.7896 0.7897 0.7899 0.7900 0.7901 0.7902 0.7902 0.7902 0.7902 0.7902 0.7902 0.7901 0.7900 0.7898 0.7895 0.7893 0.7891 0.7890 0.7888 0.7886 0.7884 0.7881 0.7878 0.7875 0.7874 0.7872 0.7871 0.7870 0.7869 0.7869 0.7869 0.7869 0.7868 0.7868 0.7867 0.7867 0.7867 0.7866 0.7866 0.7865 0.7865 0.7864 0.7864 0.7863 0.7861 0.7858 0.7856 0.7853 0.7850 0.7849 0.7847 0.7846 0.7844 0.7843 0.7843 0.7842 0.7841 0.7841 0.7841 0.7841 0.7841 0.7841 0.7841 0.7841 0.7840 0.7841 0.7841 0.7841 0.7840 0.7840 0.7839 0.7839 0.7839 0.7838 0.7838 0.7838 0.7838 0.7838 0.7839 0.7840 0.7841 0.7843 0.7844 0.7845 0.7845 0.7844 0.7843 0.7842 0.7841 0.7839 0.7838 0.7837 0.7835 0.7833 0.7831 0.7830 0.7830 0.7829 0.7828 0.7827 0.7825 0.7824 0.7823 0.7822 0.7821 0.7821 0.7821 0.7821 0.7822 0.7823 0.7823 0.7824 0.7823 0.7822 0.7821 0.7820 0.7819 0.7818 0.7816 0.7815 0.7814 0.7812 0.7811 0.7810 0.7810 0.7809 0.7809 0.7809 0.7809 0.7808 0.7808 0.7808 0.7809 0.7808 0.7807 0.7805 0.7804 0.7804 0.7803 0.7803 0.7802 0.7802 0.7802 0.7802 0.7802 0.7802 0.7801 0.7801 0.7800 0.7800 0.7799 0.7799 0.7799 0.7799 0.7798 0.7797 0.7797 0.7798 0.7799 0.7800 0.7800 0.7800 0.7800 0.7798 0.7797 0.7795 0.7794 0.7794 0.7793 0.7792 0.7791 0.7790 0.7790 0.7789 0.7789 0.7789 0.7788 0.7788 0.7788 0.7788 0.7787 0.7787 0.7786 0.7785 0.7785 0.7784 0.7784 0.7784 0.7783 0.7781 0.7781 0.7782 0.7783 0.7785 0.7787 0.7790 0.7792 0.7793 0.7794 0.7794 0.7794 0.7794 0.7794 0.7794 0.7793 0.7792 0.7790 0.7787 0.7785 0.7783 0.7781 0.7779 0.7777 0.7776 0.7773 0.7770 0.7767 0.7765 0.7764 0.7763 0.7763 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7763 0.7765 0.7765 0.7765 0.7765 0.7763 0.7762 0.7762 0.7762 0.7761 0.7761 0.7760 0.7760 0.7759 0.7757 0.7756 0.7755 0.7754 0.7753 0.7752 0.7752 0.7752 0.7752 0.7753 0.7753 0.7753 0.7753 0.7753 0.7753 0.7754 0.7756 0.7758 0.7760 0.7762 0.7763 0.7763 0.7763 0.7763 0.7763 0.7763 0.7763 0.7763 0.7763 0.7763 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7762 0.7761 0.7761 0.7761 0.7761 0.7761 0.7761 0.7761 0.7761 0.7761 0.7761 0.7761 0.7760 0.7760 0.7759 0.7757 0.7755 0.7752 0.7749 0.7747 0.7745 0.7742 0.7741 0.7739 0.7737 0.7735 0.7734 0.7733 0.7731 0.7730 0.7729 0.7729 0.7730 0.7729 0.7730 0.7731 0.7733 0.7734 0.7735 0.7736 0.7739 0.7740 0.7741 0.7741 0.7741 0.7742 0.7742 0.7742 0.7742 0.7741 0.7741 0.7741 0.7741 0.7741 0.7741 0.7741 0.7742 0.7742 0.7742 0.7742 0.7742 0.7742 0.7741 0.7741 0.7740 0.7739 0.7737 0.7735 0.7734 0.7733 0.7730 0.7728 0.7726 0.7725 0.7724 0.7724 0.7723 0.7722 0.7721 0.7719 0.7718 0.7716 0.7716 0.7715 0.7715 0.7714 0.7713 0.7712 0.7711 0.7710 0.7709 0.7708 0.7707 0.7707 0.7706 0.7706 0.7706 0.7705 0.7705 0.7705 0.7705 0.7706 0.7707 0.7708 0.7710 0.7711 0.7713 0.7714 0.7715 0.7717 0.7718 0.7718 0.7718 0.7718 0.7718 0.7718 0.7718 0.7718 0.7718 0.7718 0.7718 0.7717 0.7717 0.7717 0.7717 0.7717 0.7717 0.7717 0.7717 0.7716 0.7715 0.7713 0.7710 0.7706 0.7703 0.7699 0.7698 0.7698 0.7698 0.7700 0.7702 0.7704 0.7706 0.7708 0.7709 0.7709 0.7709 0.7709 0.7709 0.7709 0.7709 0.7708 0.7708 0.7708 0.7708 0.7708 0.7708 0.7708 0.7707 0.7707 0.7705 0.7703 0.7702 0.7702 0.7702 0.7701 0.7701 0.7701 0.7700 0.7699 0.7697 0.7695 0.7693 0.7691 0.7690 0.7689 0.7688 0.7688 0.7688 0.7688 0.7687 0.7686 0.7686 0.7686 0.7685 0.7685 0.7685 0.7685 0.7686 0.7686 0.7685 0.7685 0.7684 0.7684 0.7685 0.7687 0.7688 0.7690 0.7691 0.7691 0.7692 0.7692 0.7692 0.7692 0.7692 0.7692 0.7692 0.7692 0.7692 0.7691 0.7691 0.7691 0.7691 0.7691 0.7691 0.7691 0.7691 0.7690 0.7690 0.7690 0.7689 0.7688 0.7687 0.7686 0.7687 0.7687 0.7687 0.7687 0.7685 0.7683 0.7680 0.7677 0.7674 0.7673 0.7672 0.7670 0.7669 0.7668 0.7667 0.7666 0.7666 0.7666 0.7666 0.7665 0.7665 0.7664 0.7664 0.7663 0.7662 0.7661 0.7661 0.7660 0.7659 0.7658 0.7657 0.7656 0.7655 0.7654 0.7652 0.7650 0.7649 0.7647 0.7647 0.7647 0.7650 0.7653 0.7655 0.7658 0.7660 0.7661 0.7663 0.7663 0.7663 0.7663 0.7663 0.7663 0.7663 0.7663 0.7663 0.7663 0.7662 0.7662 0.7662 0.7662 0.7662 0.7662 0.7662 0.7662 0.7662 0.7662 0.7662 0.7661 0.7661 0.7661 0.7661 0.7661 0.7661 0.7661 0.7660 0.7659 0.7657 0.7655 0.7654 0.7652 0.7650 0.7648 0.7646 0.7645 0.7644 0.7643 0.7642 0.7642 0.7642 0.7642 0.7642 0.7642 0.7643 0.7643 0.7644 0.7644 0.7645 0.7646 0.7647 0.7648 0.7649 0.7650 0.7650 0.7650 0.7650 0.7650 0.7650 0.7650 0.7650 0.7649 0.7649 0.7649 0.7649 0.7649 0.7649 0.7649 0.7649 0.7649 0.7649 0.7649 0.7648 0.7648 0.7648 0.7648 0.7648 0.7648 0.7648 0.7647 0.7646 0.7644 0.7642 0.7639 0.7638 0.7637 0.7634 0.7631 0.7630 0.7629 0.7629 0.7629 0.7630 0.7630 0.7630 0.7632 0.7634 0.7634 0.7633 0.7633 0.7632 0.7631 0.7628 0.7626 0.7623 0.7622 0.7622 0.7621 0.7622 0.7624 0.7625 0.7626 0.7626 0.7625 0.7622 0.7619 0.7616 0.7614 0.7613 0.7612 0.7611 0.7611 0.7611 0.7610 0.7610 0.7609 0.7609 0.7608 0.7607 0.7606 0.7605 0.7605 0.7605 0.7605 0.7604 0.7603 0.7602 0.7602 0.7601 0.7599 0.7598 0.7595 0.7593 0.7591 0.7590 0.7589 0.7588 0.7587 0.7587 0.7586 0.7586 0.7585 0.7584 0.7583 0.7584 0.7584 0.7583 0.7581 0.7580 0.7579 0.7578 0.7577 0.7577 0.7578 0.7577 0.7576 0.7575 0.7573 0.7571 0.7570 0.7568 0.7568 0.7568 0.7570 0.7573 0.7576 0.7578 0.7581 0.7583 0.7585 0.7586 0.7587 0.7587 0.7587 0.7587 0.7587 0.7586 0.7586 0.7586 0.7586 0.7586 0.7586 0.7586 0.7586 0.7586 0.7586 0.7585 0.7585 0.7585 0.7585 0.7585 0.7585 0.7585 0.7585 0.7585 0.7585 0.7585 0.7584 0.7584 0.7584 0.7584 0.7584 0.7584 0.7584 0.7584 0.7584 0.7584 0.7584 0.7583 0.7583 0.7583 0.7583 0.7582 0.7580 0.7578 0.7575 0.7571 0.7567 0.7563 0.7560 0.7559 0.7559 0.7559 0.7559 0.7559 0.7558 0.7557 0.7556 0.7553 0.7553 0.7556 0.7557 0.7559 0.7561 0.7561 0.7560 0.7559 0.7558 0.7555 0.7551 0.7546 0.7539 0.7532 0.7524 0.7520 0.7514 0.7509 0.7504 0.7498 0.7492 0.7487 0.7483 0.7480 0.7478 0.7477 0.7475 0.7475 0.7473 0.7472 0.7470 0.7469 0.7467 0.7465 0.7462 0.7459 0.7455 0.7452 0.7449 0.7445 0.7442 0.7438 0.7434 0.7429 0.7423 0.7419 0.7416 0.7413 0.7411 0.7410 0.7408 0.7405 0.7402 0.7399 0.7396 0.7392 0.7389 0.7386 0.7383 0.7381 0.7379 0.7377 0.7375 0.7373 0.7370 0.7368 0.7366 0.7365 0.7364 0.7364 0.7364 0.7363 0.7362 0.7361 0.7359 0.7357 0.7354 0.7352 0.7350 0.7349 0.7348 0.7347 0.7347 0.7346 0.7344 0.7343 0.7342 0.7341 0.7340 0.7338 0.7335 0.7332 0.7329 0.7326 0.7322 0.7318 0.7313 0.7309 0.7306 0.7302 0.7300 0.7298 0.7298 0.7298 0.7299 0.7300 0.7301 0.7300 0.7298 0.7297 0.7298 0.7297 0.7296 0.7294 0.7293 0.7292 0.7291 0.7289 0.7288 0.7288 0.7288 0.7289 0.7290 0.7292 0.7293 0.7295 0.7296 0.7298 0.7300 0.7302 0.7305 0.7307 0.7308 0.7309 0.7310 0.7310 0.7310 0.7311 0.7312 0.7315 0.7318 0.7319 0.7320 0.7320 0.7321 0.7322 0.7324 0.7325 0.7326 0.7327 0.7327 0.7327 0.7327 0.7327 0.7327 0.7327 0.7327 0.7327 0.7327 0.7326 0.7326 0.7326 0.7326 0.7326 0.7326 0.7326 0.7325 0.7324 0.7322 0.7320 0.7316 0.7313 0.7309 0.7307 0.7304 0.7301 0.7298 0.7294 0.7291 0.7289 0.7287 0.7285 0.7283 0.7280 0.7279 0.7278 0.7277 0.7276 0.7275 0.7273 0.7271 0.7270 0.7269 0.7268 0.7267 0.7266 0.7265 0.7264 0.7262 0.7262 0.7261 0.7262 0.7263 0.7264 0.7266 0.7269 0.7272 0.7275 0.7277 0.7279 0.7282 0.7283 0.7285 0.7286 0.7286 0.7287 0.7287 0.7286 0.7286 0.7286 0.7286 0.7286 0.7285 0.7284 0.7281 0.7278 0.7274 0.7270 0.7265 0.7263 0.7260 0.7256 0.7253 0.7252 0.7252 0.7252 0.7252 0.7252 0.7252 0.7255 0.7258 0.7260 0.7263 0.7265 0.7267 0.7268 0.7268 0.7269 0.7268 0.7268 0.7268 0.7268 0.7268 0.7268 0.7268 0.7268 0.7268 0.7268 0.7267 0.7267 0.7267 0.7267 0.7267 0.7267 0.7267 0.7267 0.7266 0.7265 0.7264 0.7261 0.7258 0.7254 0.7249 0.7243 0.7240 0.7237 0.7232 0.7228 0.7225 0.7222 0.7220 0.7218 0.7216 0.7215 0.7214 0.7213 0.7213 0.7212 0.7211 0.7210 0.7210 0.7209 0.7209 0.7208 0.7207 0.7207 0.7206 0.7205 0.7204 0.7204 0.7203 0.7202 0.7200 0.7200 0.7200 0.7199 0.7198 0.7197 0.7197 0.7196 0.7197 0.7199 0.7201 0.7204 0.7206 0.7209 0.7212 0.7214 0.7216 0.7218 0.7219 0.7220 0.7221 0.7221 0.7221 0.7220 0.7220 0.7220 0.7220 0.7220 0.7220 0.7219 0.7219 0.7218 0.7217 0.7216 0.7215 0.7213 0.7211 0.7209 0.7207 0.7205 0.7204 0.7202 0.7200 0.7199 0.7197 0.7196 0.7195 0.7195 0.7194 0.7194 0.7193 0.7193 0.7191 0.7190 0.7190 0.7190 0.7190 0.7189 0.7189 0.7189 0.7189 0.7190 0.7192 0.7195 0.7197 0.7199 0.7201 0.7201 0.7202 0.7202 0.7201 0.7201 0.7201 0.7201 0.7201 0.7201 0.7201 0.7201 0.7201 0.7201 0.7201 0.7200 0.7200 … ] (1×39293 double)}
Specify the validation data as a subset of the testing data containing only the first file and transform the datastore fdsVal
to return the predictor data X
and the target data Y
.
indices = 1; fdsVal = subset(fdsTest,indices); dsVal = transform(fdsVal,@(data) {data.X, data.Y});
Define Network Architecture
Define the network architecture. Set the number of inputs features to five (voltage, current, temperature, average voltage, and average current).
numFeatures = 5;
Set the number of output features to one (SOC).
numResponses = 1;
Specify the number of hidden neurons.
numHiddenNeurons = 55;
Define the neural network architecture.
layers = [
sequenceInputLayer(numFeatures,Normalization="zerocenter")
fullyConnectedLayer(numHiddenNeurons)
tanhLayer
fullyConnectedLayer(numHiddenNeurons)
leakyReluLayer(0.3)
fullyConnectedLayer(numResponses)
clippedReluLayer(1)];
Specify the training options. Choosing among the options requires empirical analysis. To explore different training option configurations by running experiments, you can use the Experiment Manager app.
Train for 1200 epochs with mini-batches of size 1 using the "
adam
" solver.To prevent the gradients from exploding, set the gradient threshold to 1.
Because the training data has sequences with rows and columns corresponding to channels and time steps, respectively, specify the input data format
"CTB"
(channel, time, batch).Specify an initial learning rate of 0.01.
Specify a learning rate drop period of 400.
Specify a learning rate drop factor of 0.1.
Specify a validation frequency of 30.
Display the training progress in a plot and monitor the root mean squared error.
Disable the verbose output.
Experiments in Experiment Manager showed that the initial learning rate of 0.01 and the learning rate drop factor of 0.1 together minimize the validation error. For more information on how to optimize hyperparameters using Experiment Manager, see Choose Training Configurations for LSTM Using Bayesian Optimization.
epochs = 1200; miniBatchSize = 1; LRDropPeriod = 400; InitialLR = 0.01; LRDropFactor = 0.1; valFrequency = 30; options = trainingOptions("adam", ... InputDataFormats="CTB", ... MaxEpochs=epochs, ... SequencePaddingDirection="left", ... Shuffle="every-epoch", ... GradientThreshold=1, ... InitialLearnRate=InitialLR, ... LearnRateSchedule="piecewise", ... LearnRateDropPeriod=LRDropPeriod, ... LearnRateDropFactor=LRDropFactor, ... ValidationData=dsVal, ... ValidationFrequency=valFrequency, ... MiniBatchSize=miniBatchSize, ... Plots="training-progress", ... Metrics="rmse", ... Verbose=0);
Train Network
Train the neural network using the trainnet
function. For regression, use mean squared error loss. By default, the trainnet
function uses a GPU if one is available. Using a GPU requires a Parallel Computing Toolbox™ license and a supported GPU device. For information on supported devices, see GPU Computing Requirements (Parallel Computing Toolbox). Otherwise, the trainnet
function uses the CPU. To specify the execution environment, use the ExecutionEnvironment
training option.
net = trainnet(dsTrain,layers,"mse",options);
Test Network
Make predictions using the minibatchpredict
. function. By default, the minibatchpredict
function uses a GPU if one is available. Using a GPU requires a Parallel Computing Toolbox license and a supported GPU device. For information on supported devices, see GPU Computing Requirements (Parallel Computing Toolbox). Otherwise, the function uses the CPU. To specify the execution environment, use the ExecutionEnvironment
option. Because the data has sequences with rows and columns corresponding to channels and time steps, respectively, specify the input data format "CTB"
(channel, time, batch).
YPred = minibatchpredict(net,tdsPredictorsTest,InputDataFormats="CTB",MiniBatchSize=1,UniformOutput=false);
Compare the SOC predicted by the network to the target SOC from the test data for different temperatures.
YTarget = readall(tdsTargetsTest);
Plot the predicted and the target SOC for different ambient temperatures.
figure nexttile plot(YPred{1}) hold on plot(YTarget{1}) legend(["Predicted" "Target"],Location="Best") ylabel("SOC") xlabel("Time(s)") title("n10degC") nexttile plot(YPred{2}) hold on plot(YTarget{2}) legend(["Predicted" "Target"],Location="Best") ylabel("SOC") xlabel("Time(s)") title("0degC") nexttile plot(YPred{3}) hold on plot(YTarget{3}) legend(["Predicted" "Target"],Location="Best") ylabel("SOC") xlabel("Time(s)") title("10degC") nexttile plot(YPred{4}) hold on plot(YTarget{4}) legend(["Predicted" "Target"],Location="Best") ylabel("SOC") xlabel("Time(s)") title("25degC")
Calculate the error between the predicted SOC and the target SOC for each ambient temperature.
Err_n10degC = YPred{1} - YTarget{1}; Err_0degC = YPred{2} - YTarget{2}; Err_10degC = YPred{3} - YTarget{3}; Err_25degC = YPred{4} - YTarget{4};
Calculate the root mean squared error (RMSE) as a percentage.
RMSE_n10degC = sqrt(mean(Err_n10degC.^2))*100; RMSE_0degC = sqrt(mean(Err_0degC.^2))*100; RMSE_10degC = sqrt(mean(Err_10degC.^2))*100; RMSE_25degC = sqrt(mean(Err_25degC.^2))*100;
Calculate the maximum error as a percentage.
MAX_n10degC = max(abs(Err_n10degC))*100; MAX_0degC = max(abs(Err_0degC))*100; MAX_10degC = max(abs(Err_10degC))*100; MAX_25degC = max(abs(Err_25degC))*100;
Plot the RMSE for the different ambient temperatures.
temp = [-10,0,10,25]; figure nexttile bar(temp,[RMSE_n10degC,RMSE_0degC,RMSE_10degC,RMSE_25degC]) ylabel("RMSE (%)") xlabel("Temperature (C)")
Plot the maximum absolute error for the different ambient temperatures.
nexttile bar(temp,[MAX_n10degC,MAX_0degC,MAX_10degC,MAX_25degC]) ylabel("MAX (%)") xlabel("Temperature (C)")
Lower values in the RMSE and MAX plots indicate more accurate predictions for the corresponding temperatures. Larger values in the same plots indicate less accurate predictions for the corresponding temperatures.
References
[1] Kollmeyer, Phillip, Carlos Vidal, Mina Naguib, and Michael Skells. “LG 18650HG2 Li-Ion Battery Data and Example Deep Neural Network XEV SOC Estimator Script.” Mendeley, March 5, 2020. https://doi.org/10.17632/CP3473X7XV.3.
See Also
trainnet
| trainingOptions
| dlnetwork
| sequenceInputLayer
Related Topics
- Evaluate Code Generation Inference Time of Compressed Deep Neural Network
- Battery State of Charge Estimation in Simulink Using Feedforward Neural Network
- Sequence-to-Sequence Regression Using Deep Learning
- Sequence-to-One Regression Using Deep Learning
- Time Series Forecasting Using Deep Learning
- Sequence-to-Sequence Classification Using Deep Learning
- Deep Learning in MATLAB