Files
CSC110/celsius_plus_plus.py
T
2021-11-02 22:43:54 -04:00

76 lines
2.2 KiB
Python

import math
import numpy as np
from matplotlib import pyplot as plt
# def convert_from_c(c: int):
# k = c + 273.15
# assert k >= 0
#
# scale = [273.15, 0, 37, 100]
# mapping = [273.15, 0, 50, 100]
#
# i_scale = [scale[i + 1] - scale[i] for i in range(len(scale) - 1)]
# i_mapping = [mapping[i + 1] - mapping[i] for i in range(len(mapping) - 1)]
#
# s_scale = []
# for s in scale:
# s_scale.append(s + 0 if len(s_scale) == 0 else s_scale[-1])
# s_mapping = []
# for m in mapping:
# s_mapping.append(m + 0 if len(s_mapping) == 0 else s_mapping[-1])
#
# # 分不同部分单独 scale
# temp = []
# for d in s_scale:
# temp.append(min(d, max(k, 0)))
# k -= d
#
# s = 0
# for i in range(len(scale) - 1):
# s += temp[i] / i_scale[i] * i_mapping[i]
# s += temp[-1]
# s -= 273.15
# return s
def piecewise(c: int):
if c < 0:
return c
if c < 37:
return c / 37 * 50
if c < 100:
return 50 + (c - 37) / (100 - 37) * (100 - 50)
return 100 + (c - 100)
def plot_eq(f, lower, upper, step=0.1):
x_p = list(np.arange(lower, upper, step=step))
y_p = [f(x) for x in x_p]
plt.plot(x_p, y_p, color='#ffcccc')
if __name__ == '__main__':
xt = [-273.15, 0, 37, 100, 200]
yt = [-273.15, 0, 50, 100, 200]
plt.xticks(xt)
plt.yticks(yt)
for x in xt:
plt.axvline(x, color='lightgray')
for y in yt:
plt.axhline(y, color='lightgray')
plot_eq(piecewise, -273.15, 200)
# plot_eq(lambda x: 201.8125 + (-201.8125) / (1 + (x / 101.6479) ** 1.098977), -237.15, 200)
# plot_eq(lambda x: 381.2003 * math.e ** (-(x - 407.029) ** 2/(2 * 163.9733 ** 2)), 0, 200 + 273.15)
# plot_eq(lambda x: -437.3297 + 3.773026 * x - 0.004290584 * x ** 2, 0, 200 + 273.15)
# plot_eq(lambda x: 3229.053 - 31.29614*x + 0.1066366*x ** 2 - 0.0001159774*x ** 3, 0, 200 + 273.15)
# plt.xticks([x + 273.15 for x in xt], [str(x) for x in xt])
# plt.yticks([x + 273.15 for x in yt], [str(x) for x in yt])
plt.ylabel("°C++ (Degrees Celsius++)")
plt.xlabel("°C (Degrees Celsius)")
plt.show()
# convert_from_c(10)