Coverage for gpkit/tools/tools.py: 100%

30 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-01-07 22:13 -0500

1"""Non-application-specific convenience methods for GPkit""" 

2import numpy as np 

3# pylint: disable=invalid-name 

4 

5 

6def te_exp_minus1(posy, nterm): 

7 """Taylor expansion of e^{posy} - 1 

8 

9 Arguments 

10 --------- 

11 posy : gpkit.Posynomial 

12 Variable or expression to exponentiate 

13 nterm : int 

14 Number of non-constant terms in resulting Taylor expansion 

15 

16 Returns 

17 ------- 

18 gpkit.Posynomial 

19 Taylor expansion of e^{posy} - 1, carried to nterm terms 

20 """ 

21 res = 0 

22 factorial_denom = 1 

23 for i in range(1, nterm + 1): 

24 factorial_denom *= i 

25 res += posy**i / factorial_denom 

26 return res 

27 

28 

29def te_secant(var, nterm): 

30 """Taylor expansion of secant(var). 

31 

32 Arguments 

33 --------- 

34 var : gpkit.monomial 

35 Variable or expression argument 

36 nterm : int 

37 Number of non-constant terms in resulting Taylor expansion 

38 

39 Returns 

40 ------- 

41 gpkit.Posynomial 

42 Taylor expansion of secant(x), carried to nterm terms 

43 """ 

44 # The first 12 Euler Numbers 

45 E2n = np.asarray([1.0, 

46 5, 

47 61, 

48 1385, 

49 50521, 

50 2702765, 

51 199360981, 

52 19391512145, 

53 2404879675441, 

54 370371188237525, 

55 69348874393137901, 

56 15514534163557086905]) 

57 if nterm > 12: 

58 n_extend = np.asarray(range(13, nterm+1)) 

59 E2n_add = (8 * np.sqrt(n_extend/np.pi) 

60 * (4*n_extend/(np.pi * np.exp(1)))**(2*n_extend)) 

61 E2n = np.append(E2n, E2n_add) 

62 

63 res = 1 

64 factorial_denom = 1 

65 for i in range(1, nterm + 1): 

66 factorial_denom *= ((2*i)*(2*i-1)) 

67 res = res + var**(2*i) * E2n[i-1] / factorial_denom 

68 return res 

69 

70 

71def te_tangent(var, nterm): 

72 """Taylor expansion of tangent(var). 

73 

74 Arguments 

75 --------- 

76 var : gpkit.monomial 

77 Variable or expression argument 

78 nterm : int 

79 Number of non-constant terms in resulting Taylor expansion 

80 

81 Returns 

82 ------- 

83 gpkit.Posynomial 

84 Taylor expansion of tangent(x), carried to nterm terms 

85 """ 

86 if nterm > 15: 

87 raise NotImplementedError("Tangent expansion not implemented above" 

88 " 15 terms") 

89 

90 # The first 15 Bernoulli Numbers 

91 B2n = np.asarray([1/6, 

92 -1/30, 

93 1/42, 

94 -1/30, 

95 5/66, 

96 -691/2730, 

97 7/6, 

98 -3617/510, 

99 43867/798, 

100 -174611/330, 

101 854513/138, 

102 -236364091/2730, 

103 8553103/6, 

104 -23749461029/870, 

105 8615841276005/14322]) 

106 

107 res = 0 

108 factorial_denom = 1 

109 for i in range(1, nterm + 1): 

110 factorial_denom *= ((2*i)*(2*i-1)) 

111 res += ((-1)**(i-1) * 2**(2*i) * (2**(2*i) - 1) * 

112 B2n[i-1] / factorial_denom * var**(2*i-1)) 

113 return res