Coverage for gpkit/tools/tools.py: 100%
30 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-05 22:32 -0500
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-05 22:32 -0500
1"""Non-application-specific convenience methods for GPkit"""
2import numpy as np
3# pylint: disable=invalid-name
6def te_exp_minus1(posy, nterm):
7 """Taylor expansion of e^{posy} - 1
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
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
29def te_secant(var, nterm):
30 """Taylor expansion of secant(var).
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
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)
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
71def te_tangent(var, nterm):
72 """Taylor expansion of tangent(var).
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
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")
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])
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