# This file is part of FAST-OAD_CS23-HE : A framework for rapid Overall Aircraft Design of Hybrid
# Electric Aircraft.
# Copyright (C) 2022 ISAE-SUPAERO
import numpy as np
import plotly.graph_objects as go
[docs]
def ocv(soc):
dod = 100.0 - soc
ocv = (
-9.65121262e-10 * dod**5.0
+ 1.81419058e-07 * dod**4.0
- 1.11814100e-05 * dod**3.0
+ 2.26114438e-04 * dod**2.0
- 8.54619953e-03 * dod
+ 4.12
)
return ocv
[docs]
def r_int(soc):
dod = 100.0 - soc
internal_resistance = (
2.62771800e-11 * dod**5.0
- 1.48987233e-08 * dod**4.0
+ 2.03615618e-06 * dod**3.0
- 1.06451730e-04 * dod**2.0
+ 2.13818712e-03 * dod
+ 3.90444549e-02
)
return internal_resistance
[docs]
def v_out(soc, c_rate):
current = c_rate * 3.35
return ocv(soc) - r_int(soc) * current
if __name__ == "__main__":
soc_c_rate_1 = np.array(
[
100.0,
98.36777778,
96.73555556,
95.10333333,
93.47111111,
91.83888889,
90.20666667,
88.57444444,
86.94222222,
85.31,
83.67777778,
82.04555556,
80.41333333,
78.78111111,
77.14888889,
75.51666667,
73.88444444,
72.25222222,
70.62,
68.98777778,
67.35555556,
65.72333333,
64.09111111,
62.45888889,
60.82666667,
59.19444444,
57.56222222,
55.93,
54.29777778,
52.66555556,
51.03333333,
49.40111111,
47.76888889,
46.13666667,
44.50444444,
42.87222222,
41.24,
39.60777778,
37.97555556,
36.34333333,
34.71111111,
33.07888889,
31.44666667,
29.81444444,
28.18222222,
26.55,
24.91777778,
23.28555556,
21.65333333,
20.02111111,
]
)
voltage_c_rate_1 = np.array(
[
3.97764127,
3.95477772,
3.93278881,
3.91165698,
3.89136407,
3.87189125,
3.85321906,
3.83532733,
3.81819518,
3.80180103,
3.78612253,
3.77113654,
3.75681914,
3.74314558,
3.73009025,
3.71762666,
3.70572741,
3.69436419,
3.68350768,
3.6731276,
3.66319263,
3.6536704,
3.64452743,
3.63572913,
3.62723975,
3.61902234,
3.61103872,
3.60324944,
3.59561374,
3.58808952,
3.58063328,
3.57320009,
3.56574356,
3.55821574,
3.55056718,
3.54274675,
3.53470171,
3.52637759,
3.51771815,
3.50866535,
3.49915928,
3.48913812,
3.47853803,
3.46729317,
3.4553356,
3.44259519,
3.42899961,
3.41447424,
3.3989421,
3.38232378,
]
)
soc_c_rate_2 = np.array(
[
100.0,
98.36777778,
96.73555556,
95.10333333,
93.47111111,
91.83888889,
90.20666667,
88.57444444,
86.94222222,
85.31,
83.67777778,
82.04555556,
80.41333333,
78.78111111,
77.14888889,
75.51666667,
73.88444444,
72.25222222,
70.62,
68.98777778,
67.35555556,
65.72333333,
64.09111111,
62.45888889,
60.82666667,
59.19444444,
57.56222222,
55.93,
54.29777778,
52.66555556,
51.03333333,
49.40111111,
47.76888889,
46.13666667,
44.50444444,
42.87222222,
41.24,
39.60777778,
37.97555556,
36.34333333,
34.71111111,
33.07888889,
31.44666667,
29.81444444,
28.18222222,
26.55,
24.91777778,
23.28555556,
21.65333333,
20.02111111,
]
)
voltage_c_rate_2 = np.array(
[
3.91834584,
3.89295064,
3.86855322,
3.84513305,
3.82266893,
3.80113906,
3.78052095,
3.76079143,
3.74192665,
3.723902,
3.70669212,
3.69027088,
3.67461137,
3.65968581,
3.6454656,
3.63192125,
3.61902236,
3.6067376,
3.59503467,
3.58388028,
3.5732401,
3.56307875,
3.55335977,
3.54404555,
3.53509735,
3.5264752,
3.51813794,
3.5100431,
3.50214692,
3.4944043,
3.48676873,
3.47919229,
3.47162557,
3.46401765,
3.45631603,
3.44846662,
3.44041366,
3.43209966,
3.42346541,
3.41444985,
3.40499007,
3.39502123,
3.38447652,
3.37328708,
3.36138196,
3.34868804,
3.33512998,
3.32063016,
3.30510859,
3.28848287,
]
)
soc_c_rate_4 = np.array(
[
100.0,
98.36777778,
96.73555556,
95.10333333,
93.47111111,
91.83888889,
90.20666667,
88.57444444,
86.94222222,
85.31,
83.67777778,
82.04555556,
80.41333333,
78.78111111,
77.14888889,
75.51666667,
73.88444444,
72.25222222,
70.62,
68.98777778,
67.35555556,
65.72333333,
64.09111111,
62.45888889,
60.82666667,
59.19444444,
57.56222222,
55.93,
54.29777778,
52.66555556,
51.03333333,
49.40111111,
47.76888889,
46.13666667,
44.50444444,
42.87222222,
41.24,
39.60777778,
37.97555556,
36.34333333,
34.71111111,
33.07888889,
31.44666667,
29.81444444,
28.18222222,
26.55,
24.91777778,
23.28555556,
21.65333333,
20.02111111,
]
)
voltage_c_rate_4 = np.array(
[
3.79975498,
3.76929647,
3.74008205,
3.71208517,
3.68527865,
3.65963466,
3.63512471,
3.61171965,
3.58938959,
3.56810392,
3.54783129,
3.52853957,
3.51019581,
3.49276626,
3.4762163,
3.46051044,
3.44561226,
3.43148444,
3.41808866,
3.40538564,
3.39333503,
3.38189546,
3.37102445,
3.3606784,
3.35081255,
3.34138094,
3.33233638,
3.32363041,
3.31521328,
3.30703385,
3.29903963,
3.29117669,
3.28338961,
3.27562146,
3.26781374,
3.25990636,
3.25183755,
3.24354381,
3.23495993,
3.22601885,
3.21665164,
3.20678746,
3.1963535,
3.18527489,
3.17347468,
3.16087373,
3.14739072,
3.132942,
3.11744158,
3.10080106,
]
)
soc_c_rate_05 = np.array(
[
100.0,
98.36777778,
96.73555556,
95.10333333,
93.47111111,
91.83888889,
90.20666667,
88.57444444,
86.94222222,
85.31,
83.67777778,
82.04555556,
80.41333333,
78.78111111,
77.14888889,
75.51666667,
73.88444444,
72.25222222,
70.62,
68.98777778,
67.35555556,
65.72333333,
64.09111111,
62.45888889,
60.82666667,
59.19444444,
57.56222222,
55.93,
54.29777778,
52.66555556,
51.03333333,
49.40111111,
47.76888889,
46.13666667,
44.50444444,
42.87222222,
41.24,
39.60777778,
37.97555556,
36.34333333,
34.71111111,
33.07888889,
31.44666667,
29.81444444,
28.18222222,
26.55,
24.91777778,
23.28555556,
21.65333333,
20.02111111,
]
)
voltage_c_rate_05 = np.array(
[
4.00728898,
3.98569126,
3.9649066,
3.94491895,
3.92571164,
3.90726735,
3.88956812,
3.87259527,
3.85632945,
3.84075055,
3.82583773,
3.81156937,
3.79792303,
3.78487547,
3.77240257,
3.76047936,
3.74907994,
3.73817748,
3.72774418,
3.71775126,
3.7081689,
3.69896622,
3.69011125,
3.68157091,
3.67331095,
3.6652959,
3.65748911,
3.64985261,
3.64234716,
3.63493214,
3.62756556,
3.620204,
3.61280255,
3.60531479,
3.59769275,
3.58988682,
3.58184574,
3.57351655,
3.56484452,
3.5557731,
3.54624389,
3.53619656,
3.52556878,
3.51429622,
3.50231242,
3.48954876,
3.47593443,
3.46139628,
3.44585885,
3.42924423,
]
)
soc_c_rate_025 = np.array(
[
100.0,
98.36777778,
96.73555556,
95.10333333,
93.47111111,
91.83888889,
90.20666667,
88.57444444,
86.94222222,
85.31,
83.67777778,
82.04555556,
80.41333333,
78.78111111,
77.14888889,
75.51666667,
73.88444444,
72.25222222,
70.62,
68.98777778,
67.35555556,
65.72333333,
64.09111111,
62.45888889,
60.82666667,
59.19444444,
57.56222222,
55.93,
54.29777778,
52.66555556,
51.03333333,
49.40111111,
47.76888889,
46.13666667,
44.50444444,
42.87222222,
41.24,
39.60777778,
37.97555556,
36.34333333,
34.71111111,
33.07888889,
31.44666667,
29.81444444,
28.18222222,
26.55,
24.91777778,
23.28555556,
21.65333333,
20.02111111,
]
)
voltage_c_rate_025 = np.array(
[
4.02211284,
4.00114803,
3.9809655,
3.96154994,
3.94288543,
3.9249554,
3.90774265,
3.89122924,
3.87539658,
3.86022531,
3.84569533,
3.83178578,
3.81847497,
3.80574041,
3.79355873,
3.78190571,
3.7707562,
3.76008412,
3.74986243,
3.74006309,
3.73065703,
3.72161413,
3.71290317,
3.70449181,
3.69634654,
3.68843269,
3.6807143,
3.6731542,
3.66571386,
3.65835344,
3.6510317,
3.64370595,
3.63633204,
3.62886432,
3.62125553,
3.61345685,
3.60541775,
3.59708603,
3.5884077,
3.57932698,
3.5697862,
3.55972578,
3.54908416,
3.53779774,
3.52580083,
3.51302555,
3.49940183,
3.4848573,
3.46931723,
3.45270446,
]
)
fig = go.Figure()
scatter_025 = go.Scatter(
x=soc_c_rate_025,
y=v_out(soc_c_rate_025, 0.25),
mode="lines+markers",
name="0.25 C",
)
fig.add_trace(scatter_025)
scatter_05 = go.Scatter(
x=soc_c_rate_05,
y=v_out(soc_c_rate_05, 0.5),
mode="lines+markers",
name="0.5 C",
)
fig.add_trace(scatter_05)
scatter_1 = go.Scatter(
x=soc_c_rate_1,
y=v_out(soc_c_rate_1, 1.0),
mode="lines+markers",
name="1 C",
)
fig.add_trace(scatter_1)
scatter_2 = go.Scatter(
x=soc_c_rate_2,
y=v_out(soc_c_rate_2, 2),
mode="lines+markers",
name="2 C",
)
fig.add_trace(scatter_2)
scatter_4 = go.Scatter(
x=soc_c_rate_4,
y=v_out(soc_c_rate_4, 4),
mode="lines+markers",
name="4 C",
)
fig.add_trace(scatter_4)
fig.update_layout(
xaxis=dict(autorange="reversed"),
title_text="Polarization curve of the reference cell",
title_x=0.5,
yaxis_title="Terminal voltage [V]",
xaxis_title="SOC [%]",
legend=dict(yanchor="top", y=0.99, xanchor="right", x=0.99),
height=800,
width=1600,
)
fig.show()
fig.write_image("polarization_curve.pdf")