@@ -5,56 +5,57 @@ function transformer(::Mul, eq)
55end
66
77function transformer (:: Div , eq)
8- a = transformer (arguments (eq)[1 ])
9- b = transformer (arguments (eq)[2 ])
10- b = [(1 / q, k) for (q, k) in b]
8+ a = transformer (arguments (eq)[1 ])
9+ b = transformer (arguments (eq)[2 ])
10+ b = [(1 / q, k) for (q, k) in b]
1111 return [a; b]
1212end
1313
1414function transformer (:: Pow , eq)
1515 y, k = arguments (eq)
1616 if is_number (k)
17- r = nice_parameter (k)
18- if denominator (r) == 1
19- return [(y, k)]
20- else
21- return [(y^ (1 / denominator (r)), numerator (r))]
22- end
23- else
24- return [(eq, 1 )]
25- end
17+ r = nice_parameter (k)
18+ if r isa Integer || r isa Rational
19+ if denominator (r) == 1
20+ return [(y, k)]
21+ else
22+ return [(y^ (1 / denominator (r)), numerator (r))]
23+ end
24+ end
25+ end
26+ return [(eq, 1 )]
2627end
2728
2829function transformer (:: Any , eq)
29- return [(eq, 1 )]
30+ return [(eq, 1 )]
3031end
3132
3233function transform (eq, x)
3334 p = transformer (eq)
34- p = p[isdependent .(first .(p), x)]
35+ p = p[isdependent .(first .(p), x)]
3536 return p
3637end
3738
3839@syms u[20 ]
3940
40- function rename_factors (p, ab)
41- n = length (p)
42- q = 1
43- ks = Int[]
44- sub = Dict ()
45-
46- for (a,b) in ab
47- sub[a] = b
48- end
49-
50- for (i,(y,k)) in enumerate (p)
51- μ = u[i]
52- q *= μ ^ k
53- sub[μ] = y
54- push! (ks, k)
55- end
56-
57- return q, sub, ks
41+ function rename_factors (p, ab = () )
42+ n = length (p)
43+ q = 1
44+ ks = Int[]
45+ sub = Dict ()
46+
47+ for (a, b) in ab
48+ sub[a] = b
49+ end
50+
51+ for (i, (y, k)) in enumerate (p)
52+ μ = u[i]
53+ q *= μ^ k
54+ sub[μ] = y
55+ push! (ks, k)
56+ end
57+
58+ return q, sub, ks
5859end
5960
6061# #############################################################################
@@ -79,29 +80,26 @@ function generate_homotopy(eq, x)
7980 eq = eq isa Num ? eq. val : eq
8081 x = x isa Num ? x. val : x
8182
82- p = transform (eq, x)
83+ p = transform (eq, x)
8384 q, sub, ks = rename_factors (p, (si => Si, ci => Ci, ei => Ei, li => Li))
8485 S = 0
8586
8687 for i in 1 : length (ks)
87- μ = u[i]
88- h₁, ∂h₁ = apply_partial_int_rules (sub[μ], x)
89- h₁ = substitute (h₁, sub)
90-
91- for j = 1 : ks[i]
92- h₂ = substitute ((q / μ^ j) / ∂h₁, sub)
93- S += expand ((ω + h₁) * (ω + h₂))
94- end
95- end
96-
88+ μ = u[i]
89+ h₁, ∂h₁ = apply_partial_int_rules (sub[μ], x)
90+ h₁ = substitute (h₁, sub)
91+
92+ for j in 1 : ks[i]
93+ h₂ = substitute ((q / μ^ j) / ∂h₁, sub)
94+ S += expand ((ω + h₁) * (ω + h₂))
95+ end
96+ end
97+
9798 S = substitute (S, Dict (ω => 1 ))
98-
99- ζ = [x^ k for k= 1 : maximum (ks)+ 1 ]
100-
101- unique ([one (x); ζ; [equivalent (t, x) for t in terms (S)]])
99+ unique ([x; [equivalent (t, x) for t in terms (S)]])
102100end
103101
104- # ########################################### ##################################
102+ # ######################### Main Integration Rules ##################################
105103
106104@syms 𝛷 (x)
107105
@@ -159,17 +157,22 @@ partial_int_rules = [
159157 @rule 𝛷 (^ (~ x, ~ k:: is_abs_half )) => (sum (candidate_sqrt (~ x, ~ k);
160158 init = one (~ x)), ~ x);
161159 @rule 𝛷 (sqrt (~ x)) => (sum (candidate_sqrt (~ x, 0.5 ); init = one (~ x)), ~ x);
162- @rule 𝛷 (1 / sqrt (~ x)) => (sum (candidate_sqrt (~ x, - 0.5 ); init = one (~ x)), ~ x);
160+ @rule 𝛷 (1 / sqrt (~ x)) => (sum (candidate_sqrt (~ x, - 0.5 );
161+ init = one (~ x)), ~ x);
163162 # rational functions
164- @rule 𝛷 (1 / ^ (~ x:: is_poly , ~ k:: is_pos_int )) => (sum (candidate_pow_minus (~ x, - ~ k);
165- init = one (~ x)), ~ x)
163+ @rule 𝛷 (1 / ^ (~ x:: is_poly , ~ k:: is_pos_int )) => (sum (candidate_pow_minus (~ x,
164+ - ~ k);
165+ init = one (~ x)),
166+ ~ x)
166167 @rule 𝛷 (1 / ~ x:: is_poly ) => (sum (candidate_pow_minus (~ x, - 1 );
167- init = one (~ x)), ~ x)
168+ init = one (~ x)), ~ x);
168169 @rule 𝛷 (^ (~ x, - 1 )) => (log (~ x), ~ x)
169170 @rule 𝛷 (^ (~ x, ~ k:: is_neg_int )) => (sum (^ (~ x, i) for i in (~ k + 1 ): - 1 ),
170171 ~ x)
171172 @rule 𝛷 (1 / ~ x) => (log (~ x), ~ x)
172- @rule 𝛷 (^ (~ x, ~ k:: is_pos_int )) => (sum (^ (~ x, i+ 1 ) for i= 1 : ~ k+ 1 ), ~ x)
173+ @rule 𝛷 (^ (~ x, ~ k:: is_pos_int )) => (sum (^ (~ x, i + 1 )
174+ for i in 1 : (~ k + 1 )),
175+ ~ x)
173176 @rule 𝛷 (1 ) => (𝑥, 1 )
174177 @rule 𝛷 (~ x) => ((~ x + ^ (~ x, 2 )), ~ x)]
175178
@@ -178,5 +181,3 @@ function apply_partial_int_rules(eq, x)
178181 D = Differential (x)
179182 return y, guard_zero (expand_derivatives (D (dy)))
180183end
181-
182-
0 commit comments