@@ -94,12 +94,14 @@ function generate_homotopy(eq, x)
9494
9595 for i in 1 : length (ks)
9696 μ = u[i]
97- h₁, ∂h₁ = apply_partial_int_rules (sub[μ], x)
98- h₁ = substitute (h₁, sub)
97+ y, dy = apply_partial_int_rules (sub[μ], x)
98+
99+ y = substitute (y, sub)
100+ ∂y = guard_zero (diff (dy, x))
99101
100102 for j in 1 : ks[i]
101- h₂ = substitute ((q / μ^ j) / ∂h₁ , sub)
102- S += expand ((ω + h₁ ) * (ω + h₂ ))
103+ h = substitute ((q / μ^ j) / ∂y , sub)
104+ S += expand ((ω + y ) * (ω + h))
103105 end
104106 end
105107
@@ -109,94 +111,86 @@ end
109111
110112# ######################### Main Integration Rules ##################################
111113
112- @syms 𝛷 (x)
114+ @syms 𝛷 (x, u )
113115
114116partial_int_rules = [
115117# trigonometric functions
116- @rule 𝛷 (sin (~ x )) => (cos (~ x ) + si (~ x ), ~ x )
117- @rule 𝛷 (cos (~ x )) => (sin (~ x ) + ci (~ x ), ~ x )
118- @rule 𝛷 (tan (~ x )) => (log (cos (~ x )), ~ x )
119- @rule 𝛷 (csc (~ x )) => (log (csc (~ x ) + cot (~ x )) + log (sin (~ x )), ~ x )
120- @rule 𝛷 (sec (~ x )) => (log (sec (~ x ) + tan (~ x )) + log (cos (~ x )), ~ x )
121- @rule 𝛷 (cot (~ x )) => (log (sin (~ x )), ~ x )
118+ @rule 𝛷 (~ x, sin (~ u )) => (cos (~ u ) + si (~ u ), ~ u )
119+ @rule 𝛷 (~ x, cos (~ u )) => (sin (~ u ) + ci (~ u ), ~ u )
120+ @rule 𝛷 (~ x, tan (~ u )) => (log (cos (~ u )), ~ u )
121+ @rule 𝛷 (~ x, csc (~ u )) => (log (csc (~ u ) + cot (~ u )) + log (sin (~ u )), ~ u )
122+ @rule 𝛷 (~ x, sec (~ u )) => (log (sec (~ u ) + tan (~ u )) + log (cos (~ u )), ~ u )
123+ @rule 𝛷 (~ x, cot (~ u )) => (log (sin (~ u )), ~ u )
122124# hyperbolic functions
123- @rule 𝛷 (sinh (~ x )) => (cosh (~ x ), ~ x )
124- @rule 𝛷 (cosh (~ x )) => (sinh (~ x ), ~ x )
125- @rule 𝛷 (tanh (~ x )) => (log (cosh (~ x )), ~ x )
126- @rule 𝛷 (csch (~ x )) => (log (tanh (~ x / 2 )), ~ x )
127- @rule 𝛷 (sech (~ x )) => (atan (sinh (~ x )), ~ x )
128- @rule 𝛷 (coth (~ x )) => (log (sinh (~ x )), ~ x )
125+ @rule 𝛷 (~ x, sinh (~ u )) => (cosh (~ u ), ~ u )
126+ @rule 𝛷 (~ x, cosh (~ u )) => (sinh (~ u ), ~ u )
127+ @rule 𝛷 (~ x, tanh (~ u )) => (log (cosh (~ u )), ~ u )
128+ @rule 𝛷 (~ x, csch (~ u )) => (log (tanh (~ u / 2 )), ~ u )
129+ @rule 𝛷 (~ x, sech (~ u )) => (atan (sinh (~ u )), ~ u )
130+ @rule 𝛷 (~ x, coth (~ u )) => (log (sinh (~ u )), ~ u )
129131# 1/trigonometric functions
130- @rule 𝛷 (1 / sin (~ x )) => (log (csc (~ x ) + cot (~ x )) + log (sin (~ x )), ~ x )
131- @rule 𝛷 (1 / cos (~ x )) => (log (sec (~ x ) + tan (~ x )) + log (cos (~ x )), ~ x )
132- @rule 𝛷 (1 / tan (~ x )) => (log (sin (~ x )) + log (tan (~ x )), ~ x )
133- @rule 𝛷 (1 / csc (~ x )) => (cos (~ x ) + log (csc (~ x )), ~ x )
134- @rule 𝛷 (1 / sec (~ x )) => (sin (~ x ) + log (sec (~ x )), ~ x )
135- @rule 𝛷 (1 / cot (~ x )) => (log (cos (~ x )) + log (cot (~ x )), ~ x )
132+ @rule 𝛷 (~ x, 1 / sin (~ u )) => (log (csc (~ u ) + cot (~ u )) + log (sin (~ u )), ~ u )
133+ @rule 𝛷 (~ x, 1 / cos (~ u )) => (log (sec (~ u ) + tan (~ u )) + log (cos (~ u )), ~ u )
134+ @rule 𝛷 (~ x, 1 / tan (~ u )) => (log (sin (~ u )) + log (tan (~ u )), ~ u )
135+ @rule 𝛷 (~ x, 1 / csc (~ u )) => (cos (~ u ) + log (csc (~ u )), ~ u )
136+ @rule 𝛷 (~ x, 1 / sec (~ u )) => (sin (~ u ) + log (sec (~ u )), ~ u )
137+ @rule 𝛷 (~ x, 1 / cot (~ u )) => (log (cos (~ u )) + log (cot (~ u )), ~ u )
136138# 1/hyperbolic functions
137- @rule 𝛷 (1 / sinh (~ x )) => (log (tanh (~ x / 2 )) + log (sinh (~ x )), ~ x )
138- @rule 𝛷 (1 / cosh (~ x )) => (atan (sinh (~ x )) + log (cosh (~ x )), ~ x )
139- @rule 𝛷 (1 / tanh (~ x )) => (log (sinh (~ x )) + log (tanh (~ x )), ~ x )
140- @rule 𝛷 (1 / csch (~ x )) => (cosh (~ x ) + log (csch (~ x )), ~ x )
141- @rule 𝛷 (1 / sech (~ x )) => (sinh (~ x ) + log (sech (~ x )), ~ x )
142- @rule 𝛷 (1 / coth (~ x )) => (log (cosh (~ x )) + log (coth (~ x )), ~ x )
139+ @rule 𝛷 (~ x, 1 / sinh (~ u )) => (log (tanh (~ u / 2 )) + log (sinh (~ u )), ~ u )
140+ @rule 𝛷 (~ x, 1 / cosh (~ u )) => (atan (sinh (~ u )) + log (cosh (~ u )), ~ u )
141+ @rule 𝛷 (~ x, 1 / tanh (~ u )) => (log (sinh (~ u )) + log (tanh (~ u )), ~ u )
142+ @rule 𝛷 (~ x, 1 / csch (~ u )) => (cosh (~ u ) + log (csch (~ u )), ~ u )
143+ @rule 𝛷 (~ x, 1 / sech (~ u )) => (sinh (~ u ) + log (sech (~ u )), ~ u )
144+ @rule 𝛷 (~ x, 1 / coth (~ u )) => (log (cosh (~ u )) + log (coth (~ u )), ~ u )
143145# inverse trigonometric functions
144- @rule 𝛷 (asin (~ x )) => (~ x * asin (~ x ) + sqrt (1 - ~ x * ~ x ), ~ x )
145- @rule 𝛷 (acos (~ x )) => (~ x * acos (~ x ) + sqrt (1 - ~ x * ~ x ), ~ x )
146- @rule 𝛷 (atan (~ x )) => (~ x * atan (~ x ) + log (~ x * ~ x + 1 ), ~ x )
147- @rule 𝛷 (acsc (~ x )) => (~ x * acsc (~ x ) + atanh (1 - ^ (~ x , - 2 )), ~ x )
148- @rule 𝛷 (asec (~ x )) => (~ x * asec (~ x ) + acosh (~ x ), ~ x )
149- @rule 𝛷 (acot (~ x )) => (~ x * acot (~ x ) + log (~ x * ~ x + 1 ), ~ x )
146+ @rule 𝛷 (~ x, asin (~ u )) => (~ u * asin (~ u ) + sqrt (1 - ~ u * ~ u ), ~ u )
147+ @rule 𝛷 (~ x, acos (~ u )) => (~ u * acos (~ u ) + sqrt (1 - ~ u * ~ u ), ~ u )
148+ @rule 𝛷 (~ x, atan (~ u )) => (~ u * atan (~ u ) + log (~ u * ~ u + 1 ), ~ u )
149+ @rule 𝛷 (~ x, acsc (~ u )) => (~ u * acsc (~ u ) + atanh (1 - ^ (~ u , - 2 )), ~ u )
150+ @rule 𝛷 (~ x, asec (~ u )) => (~ u * asec (~ u ) + acosh (~ u ), ~ u )
151+ @rule 𝛷 (~ x, acot (~ u )) => (~ u * acot (~ u ) + log (~ u * ~ u + 1 ), ~ u )
150152# inverse hyperbolic functions
151- @rule 𝛷 (asinh (~ x )) => (~ x * asinh (~ x ) + sqrt (~ x * ~ x + 1 ), ~ x )
152- @rule 𝛷 (acosh (~ x )) => (~ x * acosh (~ x ) + sqrt (~ x * ~ x - 1 ), ~ x )
153- @rule 𝛷 (atanh (~ x )) => (~ x * atanh (~ x ) + log (~ x + 1 ), ~ x )
154- @rule 𝛷 (acsch (~ x )) => (acsch (~ x ), ~ x )
155- @rule 𝛷 (asech (~ x )) => (asech (~ x ), ~ x )
156- @rule 𝛷 (acoth (~ x )) => (~ x * acot (~ x ) + log (~ x + 1 ), ~ x )
153+ @rule 𝛷 (~ x, asinh (~ u )) => (~ u * asinh (~ u ) + sqrt (~ u * ~ u + 1 ), ~ u )
154+ @rule 𝛷 (~ x, acosh (~ u )) => (~ u * acosh (~ u ) + sqrt (~ u * ~ u - 1 ), ~ u )
155+ @rule 𝛷 (~ x, atanh (~ u )) => (~ u * atanh (~ u ) + log (~ u + 1 ), ~ u )
156+ @rule 𝛷 (~ x, acsch (~ u )) => (acsch (~ u ), ~ u )
157+ @rule 𝛷 (~ x, asech (~ u )) => (asech (~ u ), ~ u )
158+ @rule 𝛷 (~ x, acoth (~ u )) => (~ u * acot (~ u ) + log (~ u + 1 ), ~ u )
157159# logarithmic and exponential functions
158- @rule 𝛷 (log (~ x )) => (~ x + ~ x * log (~ x ) + sum (pow_minus_rule (~ x, - 1 ); init = one (~ x )),
159- ~ x );
160- @rule 𝛷 (1 / log (~ x )) => (log (log (~ x )) + li (~ x ), ~ x )
161- @rule 𝛷 (exp (~ x )) => (exp (~ x ) + ei (~ x ) + erfi_rule (~ x), ~ x )
162- @rule 𝛷 (^ (exp (~ x ), ~ k:: is_neg )) => (^ (exp (- ~ x ), - ~ k), ~ x )
160+ @rule 𝛷 (~ x, log (~ u )) => (~ u + ~ u * log (~ u ) + sum (pow_minus_rule (~ u, ~ x, - 1 ); init = one (~ u )),
161+ ~ u );
162+ @rule 𝛷 (~ x, 1 / log (~ u )) => (log (log (~ u )) + li (~ u ), ~ u )
163+ @rule 𝛷 (~ x, exp (~ u )) => (exp (~ u ) + ei (~ u ) + erfi_ (~ x), ~ u )
164+ @rule 𝛷 (~ x, ^ (exp (~ u ), ~ k:: is_neg )) => (^ (exp (- ~ u ), - ~ k), ~ u )
163165# square-root functions
164- @rule 𝛷 (^ (~ x , ~ k:: is_abs_half )) => (sum (sqrt_rule (~ x, ~ k); init = one (~ x )), ~ x );
165- @rule 𝛷 (sqrt (~ x )) => (sum (sqrt_rule (~ x, 0.5 ); init = one (~ x )), ~ x );
166- @rule 𝛷 (1 / sqrt (~ x )) => (sum (sqrt_rule (~ x, - 0.5 ); init = one (~ x )), ~ x );
166+ @rule 𝛷 (~ x, ^ (~ u , ~ k:: is_abs_half )) => (sum (sqrt_rule (~ u, ~ x, ~ k); init = one (~ u )), ~ u );
167+ @rule 𝛷 (~ x, sqrt (~ u )) => (sum (sqrt_rule (~ u, ~ x, 0.5 ); init = one (~ u )), ~ u );
168+ @rule 𝛷 (~ x, 1 / sqrt (~ u )) => (sum (sqrt_rule (~ u, ~ x, - 0.5 ); init = one (~ u )), ~ u );
167169# rational functions
168- @rule 𝛷 (1 / ^ (~ x :: is_univar_poly , ~ k:: is_pos_int )) => (sum (pow_minus_rule (~ x, - ~ k);
169- init = one (~ x )),
170- ~ x );
171- @rule 𝛷 (1 / ~ x :: is_univar_poly ) => (sum (pow_minus_rule (~ x, - 1 ); init = one (~ x )), ~ x );
172- @rule 𝛷 (^ (~ x , - 1 )) => (log (~ x) , ~ x )
173- @rule 𝛷 (^ (~ x , ~ k:: is_neg_int )) => (sum (^ (~ x , i) for i in (~ k + 1 ): - 1 ), ~ x )
174- @rule 𝛷 (1 / ~ x ) => (log (~ x ), ~ x )
175- @rule 𝛷 (^ (~ x , ~ k:: is_pos_int )) => (sum (^ (~ x , i + 1 ) for i in 1 : (~ k + 1 )), ~ x )
176- @rule 𝛷 (1 ) => (𝑥, 1 )
177- @rule 𝛷 (~ x) => ((~ x + ^ (~ x , 2 )), ~ x )]
170+ @rule 𝛷 (~ x, 1 / ^ (~ u :: is_univar_poly , ~ k:: is_pos_int )) => (sum (pow_minus_rule (~ u, ~ x, - ~ k);
171+ init = one (~ u )),
172+ ~ u );
173+ @rule 𝛷 (~ x, 1 / ~ u :: is_univar_poly ) => (sum (pow_minus_rule (~ u, ~ x, - 1 ); init = one (~ u )), ~ u );
174+ @rule 𝛷 (~ x, ^ (~ u , - 1 )) => (log (~ u) + ~ u * log ( ~ u) , ~ u )
175+ @rule 𝛷 (~ x, ^ (~ u , ~ k:: is_neg_int )) => (sum (^ (~ u , i) for i in (~ k + 1 ): - 1 ), ~ u )
176+ @rule 𝛷 (~ x, 1 / ~ u ) => (log (~ u ), ~ u )
177+ @rule 𝛷 (~ x, ^ (~ u , ~ k:: is_pos_int )) => (sum (^ (~ u , i + 1 ) for i in 1 : (~ k + 1 )), ~ u )
178+ @rule 𝛷 (~ x, 1 ) => (𝑥, 1 )
179+ @rule 𝛷 (~ x, ~ u ) => ((~ u + ^ (~ u , 2 )), ~ u )]
178180
179181function apply_partial_int_rules (eq, x)
180- y, dy = Chain (partial_int_rules)(𝛷 (value (eq)))
181- return y, guard_zero ( diff (dy, x))
182+ y, dy = Chain (partial_int_rules)(𝛷 (x, value (eq)))
183+ return y, dy
182184end
183185
184186# ###############################################################
185187
186- function erfi_rule (eq)
187- if is_univar_poly (eq)
188- x = var (eq)
189- return erfi_ (x)
190- end
191- return 0
192- end
193-
194- function pow_minus_rule (p, k; abstol = 1e-8 )
188+ function pow_minus_rule (p, x, k; abstol = 1e-8 )
195189 if ! is_univar_poly (p)
196- return [p^ k, p^ (k + 1 ), log (p)]
190+ return [p^ k, p^ (k + 1 ), log (p), p * log (p) ]
197191 end
198192
199- x = var (p)
193+ # x = var(p)
200194 d = poly_deg (p)
201195
202196 for j in 1 : 10 # will try 10 times to find the roots
@@ -229,14 +223,17 @@ function pow_minus_rule(p, k; abstol = 1e-8)
229223 end
230224end
231225
232- function sqrt_rule (p, k)
226+ function sqrt_rule (p, x, k)
233227 h = Any[p^ k, p^ (k + 1 )]
228+
229+ Δ = diff (p, x)
230+ push! (h, log (Δ/ 2 + sqrt (p)))
234231
235232 if ! is_univar_poly (p)
236233 return h
237234 end
238235
239- x = var (p)
236+ # x = var(p)
240237
241238 if poly_deg (p) == 2
242239 r, s = find_roots (p, x)
@@ -255,7 +252,6 @@ function sqrt_rule(p, k)
255252 end
256253 end
257254
258- Δ = expand_derivatives (Differential (x)(p))
259- push! (h, log (0.5 * Δ + sqrt (p)))
260255 return h
261256end
257+
0 commit comments