Contenido principal

Calculate Five-Cycle Electric Vehicle Range Adjustment Factor

This example shows how to calculate the five-cycle electric vehicle (EV) range adjustment factor using the SAE J1634 [1] method. This factor helps determine the miles per gallon equivalent (MPGe) displayed on the Monroney sticker, providing a more realistic estimate of MPGe than the default adjustment factor of 0.7.

To calculate the adjustment factor, use data from the five-cycle and two-cycle fuel economy (FE) tests. The two-cycle FE test provides fuel economy data based on standardized city and highway driving cycles, while the five-cycle FE test captures more realistic real world driving cycles, conditions, and styles.

AdjustmentFactor=Combined5CycleFECombined2CycleFE

To calculate the five-cycle FE, use data from these tests:

  • Federal test procedure (FTP-75)

  • Highway fuel economy test (HWFET)

  • US06

  • SC03

  • Cold FTP

To calculate the combined two-cycle FE, use data from one of these tests:

  • Single cycle test (SCT)

  • Multi-cycle test (MCT)

  • Short multi-cycle test (SMCT)

  • Short multi-cycle test with steady-state speed segments (SMCT+)

You can obtain the required data from either a virtual vehicle model or a dynamometer. Physical testing requires extensive procedures outlined in SAE J1634. In contrast, you can perform simulation-based calculations without many of the detailed testing requirements specified in the standard. For more information on collecting simulation data using a virtual vehicle model, see Simulate Five-Cycle Energy Consumption Tests Using Virtual Vehicle Model.

After running the tests and preparing the input data, you are ready to calculate the adjustment factor.

In this example, follow these steps to calculate the adjustment factor:

  1. Set up the five-cycle and two-cycle energy consumption tables.

  2. Set the recharge allocation factor.

  3. Calculate the energy per mile.

  4. Calculate the adjustment factor with and without thermal conditioning.

Set Up Energy Consumption Tables

Set up the five-cycle and two-cycle energy consumption tables.

Five-Cycle Energy Consumption Table

Enter these parameter values for the five-cycle energy consumption table:

  • Test data keys

  • Test names

  • Bag names

  • Time ranges

  • Variable names

  • Number of rows

testDataKey5 = ["FTP75"; "FTP75"; "FTP75"; "HWFET"; "US06"; "US06"; "SC03";"FTP75";"FTP75";"FTP75"];
testNames5 = [ "FTP";   "FTP";   "FTP"; "HFEDS"; "US06"; "US06"; "SC03";"20F FTP";"20F FTP"; "20F FTP CD"]; 
bagNames5 = ["1"; "2";  "3";  "1";  "City"; "Highway"; "1";"1";"3";"All"];
timeRanges5 = {[0, 505], [505, 1374], [1969, inf], [], [0, 131; 496, 600], [131, 496], [],[0,505],[1969, inf],[0 inf]};
varNames5 = ["Test", "Bag", "whDC/mile","mile/kWhDC","mile/kWhAC"];
numRows5 = length(testDataKey5);

Create the table.

cycleEnrgyTbl5 = table(testNames5, bagNames5, zeros(numRows5,1), zeros(numRows5,1),zeros(numRows5,1),VariableNames=varNames5);

Two-Cycle Energy Consumption Table

Enter these parameter values for the two-cycle energy consumption table:

  • Test data keys

  • Test names

  • Bag names

  • Time ranges

  • Variable names

  • Number of rows

testDataKey2 =  ["FTP75"; "HWFET"];
testNames2 =  ["CD UDDS";"CD HFEDS"];
bagNames2 =  [" "; " "];
timeRanges2 = {[0, inf], [0, inf]};
varNames2 = ["Test", "Bag", "whDC/mile","mile/kWhDC","mile/kWhAC"];
numRows2 = length(testDataKey2);

Create the table.

cycleEnrgyTbl2 = table(testNames2, bagNames2, zeros(numRows2,1),zeros(numRows2,1),zeros(numRows2,1),VariableNames=varNames2);

Set Recharge Allocation Factor

Enter values for the recharge allocation factor (RAF). The RAF is the ratio of the full depletion AC recharge energy and the full depletion DC discharge energy. The values in this example are from the SAE J1634 documentation.

RAF75F = 1.15;
RAF20F = 1.25;

Calculate Energy Per Mile

You can calculate the energy per mile using simulation data or dynamometer data. When the check box is selected, the example uses the simulation data stored to the CycleSimData.mat file. When the check box is not selected, the example uses dynamometer data provided in the J1634 documentation.

if true
    useSimulationData=true;
else
    useSimulationData=false;
end

Simulation Data

Calculate the five-cycle and two-cycle energy per mile values using the simulation data saved to the file CycleSimData.mat. This data was generated using an EV-configured virtual vehicle model. The 20F FTP drive cycle was not simulated when generating the test dataset for this example. As a result, the values for Bags 1, 3, and all charge-depleting (CD) bags are placeholders taken from the FTP75 cycle. See Simulate Five-Cycle Energy Consumption Tests Using Virtual Vehicle Model.

if useSimulationData

unzip("CycleSimData.zip")
simData = load("CycleSimData.mat");
simData = simData.simData;

for i = 1:(numRows5-3)
    cycleData5 = simData(testDataKey5(i));
    enrgyPerDist5 = getEvPwrPerDist(cycleData5.VehSpd, cycleData5.BattPwr, timeRanges5{i});
    cycleEnrgyTbl5.("whDC/mile")(i) = enrgyPerDist5;
    cycleEnrgyTbl5.("mile/kWhDC")(i) = 1000/enrgyPerDist5;
    cycleEnrgyTbl5.("mile/kWhAC")(i) = 1000/enrgyPerDist5/RAF75F;
end

for i = (numRows5-2):numRows5
    cycleData5 = simData(testDataKey5(i));
    enrgyPerDist5 = getEvPwrPerDist(cycleData5.VehSpd, cycleData5.BattPwr, timeRanges5{i});
    cycleEnrgyTbl5.("whDC/mile")(i) = enrgyPerDist5;
    cycleEnrgyTbl5.("mile/kWhDC")(i) = 1000/enrgyPerDist5;
    cycleEnrgyTbl5.("mile/kWhAC")(i) = 1000/enrgyPerDist5/RAF20F;
end

disp(cycleEnrgyTbl5)

for i = 1:numRows2
    cycleData2 = simData(testDataKey2(i));
    enrgyPerDist2 = getEvPwrPerDist(cycleData2.VehSpd, cycleData2.BattPwr, timeRanges2{i});
    cycleEnrgyTbl2.("whDC/mile")(i) = enrgyPerDist2;
    cycleEnrgyTbl2.("mile/kWhDC")(i) = 1000/enrgyPerDist2;
    cycleEnrgyTbl2.("mile/kWhAC")(i) = 1000/enrgyPerDist2/RAF75F;
end

disp(cycleEnrgyTbl2)
end
        Test           Bag       whDC/mile    mile/kWhDC    mile/kWhAC
    ____________    _________    _________    __________    __________

    "FTP"           "1"           220.11        4.5432        3.9506  
    "FTP"           "2"           208.23        4.8024         4.176  
    "FTP"           "3"              224        4.4644        3.8821  
    "HFEDS"         "1"            211.9        4.7192        4.1037  
    "US06"          "City"        354.03        2.8246        2.4562  
    "US06"          "Highway"     284.22        3.5184        3.0594  
    "SC03"          "1"           221.34        4.5179        3.9286  
    "20F FTP"       "1"           220.11        4.5432        3.6346  
    "20F FTP"       "3"              224        4.4644        3.5715  
    "20F FTP CD"    "All"         217.21        4.6038         3.683  
       Test       Bag    whDC/mile    mile/kWhDC    mile/kWhAC
    __________    ___    _________    __________    __________

    "CD UDDS"     " "     217.21        4.6038        4.0033  
    "CD HFEDS"    " "      211.9        4.7192        4.1037  

Dynamometer Data

When simulation data is not available, calculate the five-cycle and two-cycle energy per mile using test or energy consumption dynamometer data. Enter values for the five-cycle and two-cycle energy consumption tables. The values in this example are provided from the J1634 documentation.

if ~useSimulationData

cycleEnrgyTbl5{1,3}=216.3; %FTP     Bag 1
cycleEnrgyTbl5{2,3}=204.6; %FTP     Bag 2
cycleEnrgyTbl5{3,3}=210.2; %FTP     Bag 3
cycleEnrgyTbl5{4,3}=188.6; %HFEDS   Bag 1
cycleEnrgyTbl5{5,3}=315.8; %US06    City
cycleEnrgyTbl5{6,3}=219.7; %US06    Highway
cycleEnrgyTbl5{7,3}=312.5; %SC03    Bag 1
cycleEnrgyTbl5{8,3}=438.7; %20F FTP Bag 1
cycleEnrgyTbl5{9,3}=426.5; %20F FTP Bag 2
cycleEnrgyTbl5{10,3}=406.1; %20F FTP CD All

for i = 1:7
    cycleEnrgyTbl5.("mile/kWhDC")(i) = 1000/cycleEnrgyTbl5.("whDC/mile")(i);
    cycleEnrgyTbl5.("mile/kWhAC")(i) = 1000/cycleEnrgyTbl5.("whDC/mile")(i)/RAF75F;
end
for i = 8:10
    cycleEnrgyTbl5.("mile/kWhDC")(i) = 1000/cycleEnrgyTbl5.("whDC/mile")(i);
    cycleEnrgyTbl5.("mile/kWhAC")(i) = 1000/cycleEnrgyTbl5.("whDC/mile")(i)/RAF20F;
end

cycleEnrgyTbl2{1,3}=212.3458; %CD UDDS
cycleEnrgyTbl2{2,3}=186.633; %CD HFEDS

for i = 1:2
    cycleEnrgyTbl2.("mile/kWhDC")(i) = 1000/cycleEnrgyTbl2.("whDC/mile")(i);
    cycleEnrgyTbl2.("mile/kWhAC")(i) = 1000/cycleEnrgyTbl2.("whDC/mile")(i)/RAF75F;
end

disp(cycleEnrgyTbl5)
disp(cycleEnrgyTbl2)
end

Calculate Adjustment Factor

The calculateFE helper function uses methods from SAE J1634 Appendix B to calculate the adjustment factor. You will calculate two adjustment factor values. One using DC energy consumption when there is no thermal conditioning, and one using AC energy consumption when thermal conditioning is present.

calculateFE(cycleEnrgyTbl5, cycleEnrgyTbl2)
                               CityFE    HighwayFE    Combined5CycleFE    Combined2CycleFE    AdjFactor
                               ______    _________    ________________    ________________    _________

    No Thermal Conditioning    4.0408     3.3946            3.722               4.655          0.79957 
    Thermal Conditioning       3.4624     2.9519           3.2124              4.0478          0.79361 
type calculateFE.m
function calculateFE(cycleEnrgyTbl5, cycleEnrgyTbl2)
    % Extract values from cycleEnrgyTbl5
    Bag1FTP_nTC = cycleEnrgyTbl5{1,4}; Bag2FTP_nTC = cycleEnrgyTbl5{2,4};
    Bag3FTP_nTC = cycleEnrgyTbl5{3,4}; HFEDS_nTC = cycleEnrgyTbl5{4,4};
    US06City_nTC = cycleEnrgyTbl5{5,4}; US06Highway_nTC = cycleEnrgyTbl5{6,4};
    SC03_nTC = cycleEnrgyTbl5{7,4}; Bag120FColdFTP_nTC = cycleEnrgyTbl5{8,4};
    Bag320FColdFTP_nTC = cycleEnrgyTbl5{9,4}; CD20FColdFTP_nTC = cycleEnrgyTbl5{10,4};

    Bag1FTP_wTC = cycleEnrgyTbl5{1,5}; Bag2FTP_wTC = cycleEnrgyTbl5{2,5};
    Bag3FTP_wTC = cycleEnrgyTbl5{3,5}; HFEDS_wTC = cycleEnrgyTbl5{4,5};
    US06City_wTC = cycleEnrgyTbl5{5,5}; US06Highway_wTC = cycleEnrgyTbl5{6,5};
    SC03_wTC = cycleEnrgyTbl5{7,5}; Bag120FColdFTP_wTC = cycleEnrgyTbl5{8,5};
    Bag320FColdFTP_wTC = cycleEnrgyTbl5{9,5}; CD20FColdFTP_wTC = cycleEnrgyTbl5{10,5};

    % City FE Calculation
    RunningFC_nTC = 0.82*(0.48/Bag2FTP_nTC + 0.41/Bag3FTP_nTC + 0.11/US06City_nTC) + ...
                    0.18*(1/CD20FColdFTP_nTC) + 0.133*1.083*(1/SC03_nTC - (0.61/Bag3FTP_nTC + 0.39/Bag2FTP_nTC));
    StartFuelFTP_nTC = 3.6*(1/Bag1FTP_nTC - 1/Bag3FTP_nTC);
    StartFuel20FColdFTP_nTC = 3.6*(1/Bag120FColdFTP_nTC - 1/Bag320FColdFTP_nTC);
    StartFC_nTC = 0.33*((0.76*StartFuelFTP_nTC + 0.24*StartFuel20FColdFTP_nTC)/4.1);
    CityFE_nTC = 0.92/(StartFC_nTC + RunningFC_nTC);

    RunningFC_wTC = 0.82*(0.48/Bag2FTP_wTC + 0.41/Bag3FTP_wTC + 0.11/US06City_wTC) + ...
                    0.18*(1/CD20FColdFTP_wTC) + 0.133*1.083*(1/SC03_wTC - (0.61/Bag3FTP_wTC + 0.39/Bag2FTP_wTC));
    StartFuelFTP_wTC = 3.6*(1/Bag1FTP_wTC - 1/Bag3FTP_wTC);
    StartFuel20FColdFTP_wTC = 3.6*(1/Bag120FColdFTP_wTC - 1/Bag320FColdFTP_wTC);
    StartFC_wTC = 0.33*((0.76*StartFuelFTP_wTC + 0.24*StartFuel20FColdFTP_wTC)/4.1);
    CityFE_wTC = 0.92/(StartFC_wTC + RunningFC_wTC);

    % Highway FE Calculation
    RunningFC_nTC = 1.007*(0.79/US06Highway_nTC + 0.21/HFEDS_nTC) + ...
                    0.133*0.377*(1/SC03_nTC - (0.61/Bag3FTP_nTC + 0.39/Bag2FTP_nTC));
    StartFC_nTC = 0.33*((0.76*StartFuelFTP_nTC + 0.24*StartFuel20FColdFTP_nTC)/60);
    HighwayFE_nTC = 0.92/(StartFC_nTC + RunningFC_nTC);

    RunningFC_wTC = 1.007*(0.79/US06Highway_wTC + 0.21/HFEDS_wTC) + ...
                    0.133*0.377*(1/SC03_wTC - (0.61/Bag3FTP_wTC + 0.39/Bag2FTP_wTC));
    StartFC_wTC = 0.33*((0.76*StartFuelFTP_wTC + 0.24*StartFuel20FColdFTP_wTC)/60);
    HighwayFE_wTC = 0.92/(StartFC_wTC + RunningFC_wTC);

    % Combined 5-cycle FE
    Combined5CycleFE_nTC = 1/(0.55/CityFE_nTC + 0.45/HighwayFE_nTC);
    Combined5CycleFE_wTC = 1/(0.55/CityFE_wTC + 0.45/HighwayFE_wTC);

    % Combined 2-cycle CD results
    CityFE_nTC_2cycle = cycleEnrgyTbl2{1,4}; HighwayFE_nTC_2cycle = cycleEnrgyTbl2{2,4};
    CityFE_wTC_2cycle = cycleEnrgyTbl2{1,5}; HighwayFE_wTC_2cycle = cycleEnrgyTbl2{2,5};

    % Combined 2-cycle CD test DC Discharge FE
    Combined2CycleFE_nTC = 1/(0.55/CityFE_nTC_2cycle + 0.45/HighwayFE_nTC_2cycle);
    Combined2CycleFE_wTC = 1/(0.55/CityFE_wTC_2cycle + 0.45/HighwayFE_wTC_2cycle);

    % Adjustment Factors
    AdjFactor_nTC = Combined5CycleFE_nTC / Combined2CycleFE_nTC;
    AdjFactor_wTC = Combined5CycleFE_wTC / Combined2CycleFE_wTC;

    % Create and display results table
    VariableNames = {'CityFE', 'HighwayFE', 'Combined5CycleFE', 'Combined2CycleFE', 'AdjFactor'};
    NoTC = [CityFE_nTC, HighwayFE_nTC, Combined5CycleFE_nTC, Combined2CycleFE_nTC, AdjFactor_nTC];
    WithTC = [CityFE_wTC, HighwayFE_wTC, Combined5CycleFE_wTC, Combined2CycleFE_wTC, AdjFactor_wTC];

    ResultsTable = array2table([NoTC; WithTC], ...
        'VariableNames', VariableNames, ...
        'RowNames', {'No Thermal Conditioning', 'Thermal Conditioning'});

    disp(ResultsTable);
end

References

[1] SAE J1634. "Battery Electric Vehicle Energy Consumption and Range Test Procedure". Warrendale, PA: SAE International, revised April 2021, issued May 1993. https://doi.org/10.4271/J1634_202104.

See Also

External Websites