def test_basic_math(types): for x in types["all"]: for y in types["all"]: ### Arithmetic x + y x - y x * y x / y np.sum(x) # Sum of all entries of array-like object x ### Exponentials & Powers x**y np.power(x, y) np.exp(x) np.log(x) np.log10(x) np.sqrt(x) # Note: do x ** 0.5 rather than np.sqrt(x). ### Trig np.sin(x) np.cos(x) np.tan(x) np.arcsin(x) np.arccos(x) np.arctan(x) np.arctan2(y, x) np.sinh(x) np.cosh(x) np.tanh(x) np.arcsinh(x) np.arccosh(x) np.arctanh(x - 0.5) # `- 0.5` to give valid argument
def sigmoid( x, sigmoid_type: str = "tanh", normalization_range: Tuple[Union[float, int], Union[float, int]] = (0, 1) ): """ A sigmoid function. From Wikipedia (https://en.wikipedia.org/wiki/Sigmoid_function): A sigmoid function is a mathematical function having a characteristic "S"-shaped curve or sigmoid curve. Args: x: The input sigmoid_type: Type of sigmoid function to use [str]. Can be one of: * "tanh" or "logistic" (same thing) * "arctan" * "polynomial" normalization_type: Range in which to normalize the sigmoid, shorthanded here in the documentation as "N". This parameter is given as a two-element tuple (min, max). After normalization: >>> sigmoid(-Inf) == normalization_range[0] >>> sigmoid(Inf) == normalization_range[1] * In the special case of N = (0, 1): >>> sigmoid(-Inf) == 0 >>> sigmoid(Inf) == 1 >>> sigmoid(0) == 0.5 >>> d(sigmoid)/dx at x=0 == 0.5 * In the special case of N = (-1, 1): >>> sigmoid(-Inf) == -1 >>> sigmoid(Inf) == 1 >>> sigmoid(0) == 0 >>> d(sigmoid)/dx at x=0 == 1 Returns: The value of the sigmoid. """ ### Sigmoid equations given here under the (-1, 1) normalization: if sigmoid_type == ("tanh" or "logistic"): # Note: tanh(x) is simply a scaled and shifted version of a logistic curve; after # normalization these functions are identical. s = _np.tanh(x) elif sigmoid_type == "arctan": s = 2 / _np.pi * _np.arctan(_np.pi / 2 * x) elif sigmoid_type == "polynomial": s = x / (1 + x ** 2) ** 0.5 else: raise ValueError("Bad value of parameter 'type'!") ### Normalize min = normalization_range[0] max = normalization_range[1] s_normalized = s * (max - min) / 2 + (max + min) / 2 return s_normalized
) # From AVF Eq. 4.53 c_f = 2 / Re_theta * np.where( H < 6.2, -0.066 + 0.066 * np.abs(6.2 - H) ** 1.5 / (H - 1), -0.066 + 0.066 * (H - 6.2) ** 2 / (H - 4) ** 2 ) # From AVF Eq. 4.54 c_D = H_star / 2 / Re_theta * np.where( H < 4, 0.207 + 0.00205 * np.abs(4 - H) ** 5.5, 0.207 - 0.100 * (H - 4) ** 2 / H ** 2 ) # From AVF Eq. 4.55 Re_theta_o = 10 ** ( 2.492 / (H - 1) ** 0.43 + 0.7 * ( np.tanh( 14 / (H - 1) - 9.24 ) + 1 ) ) # From AVF Eq. 6.38 d_theta_dx = np.diff(theta) / np.diff(x) d_ue_dx = np.diff(ue) / np.diff(x) d_H_star_dx = np.diff(H_star) / np.diff(x) def int(x): return (x[1:] + x[:-1]) / 2 def logint(x): # return int(x)
H_0, n_vars=N, ) Re_theta = ue * theta / nu H_star = np.where(H < 4, 1.515 + 0.076 * (H - 4)**2 / H, 1.515 + 0.040 * (H - 4)**2 / H) # From AVF Eq. 4.53 c_f = 2 / Re_theta * np.where(H < 6.2, -0.066 + 0.066 * np.abs(6.2 - H)**1.5 / (H - 1), -0.066 + 0.066 * (H - 6.2)**2 / (H - 4)**2) # From AVF Eq. 4.54 c_D = H_star / 2 / Re_theta * np.where( H < 4, 0.207 + 0.00205 * np.abs(4 - H)**5.5, 0.207 - 0.100 * (H - 4)**2 / H**2) # From AVF Eq. 4.55 Re_theta_o = 10**(2.492 / (H - 1)**0.43 + 0.7 * (np.tanh(14 / (H - 1) - 9.24) + 1)) # From AVF Eq. 6.38 d_theta_dx = np.diff(theta) / np.diff(x) d_ue_dx = np.diff(ue) / np.diff(x) d_H_star_dx = np.diff(H_star) / np.diff(x) def int(x): return (x[1:] + x[:-1]) / 2 def logint(x): # return int(x) logx = np.log(x) return np.exp((logx[1:] + logx[:-1]) / 2)