@@ -56,20 +56,20 @@ Returns a tuple of (solved, unsolved, err) if `detailed == true`, where
56
56
Returns the resulting integral or nothing if `detailed == false`
57
57
"""
58
58
function integrate (eq, x = nothing ;
59
- abstol = 1e-6 ,
60
- num_steps = 2 ,
61
- num_trials = 10 ,
62
- radius = 5.0 ,
63
- show_basis = false ,
64
- opt = STLSQ (exp .(- 10 : 1 : 0 )),
65
- bypass = false ,
66
- symbolic = false ,
67
- max_basis = 100 ,
68
- verbose = false ,
69
- complex_plane = true ,
70
- homotopy = true ,
71
- use_optim = false ,
72
- detailed = true )
59
+ abstol = 1e-6 ,
60
+ num_steps = 2 ,
61
+ num_trials = 10 ,
62
+ radius = 5.0 ,
63
+ show_basis = false ,
64
+ opt = STLSQ (exp .(- 10 : 1 : 0 )),
65
+ bypass = false ,
66
+ symbolic = false ,
67
+ max_basis = 100 ,
68
+ verbose = false ,
69
+ complex_plane = true ,
70
+ homotopy = true ,
71
+ use_optim = false ,
72
+ detailed = true )
73
73
deprecation_warnings (; homotopy, use_optim)
74
74
75
75
eq = expand (eq)
@@ -130,6 +130,32 @@ function integrate(eq, xx::Tuple; kwargs...)
130
130
return nothing
131
131
end
132
132
133
+ function get_solved (p, sol)
134
+ if sol isa Tuple
135
+ s = sol[1 ]
136
+ return s == nothing ? 0 : s
137
+ else
138
+ return sol == nothing ? 0 : sol
139
+ end
140
+ end
141
+
142
+ function get_unsolved (p, sol)
143
+ if sol isa Tuple
144
+ u = sol[2 ]
145
+ return u == nothing ? 0 : u
146
+ else
147
+ return sol == 0 || sol == nothing ? p : 0
148
+ end
149
+ end
150
+
151
+ function get_err (p, sol)
152
+ if sol isa Tuple
153
+ return sol[3 ]
154
+ else
155
+ return sol == 0 || sol == nothing ? Inf : 0
156
+ end
157
+ end
158
+
133
159
# integrate_sum applies the integral summation rule ∫ Σᵢ fᵢ(x) dx = Σᵢ ∫ fᵢ(x) dx
134
160
function integrate_sum (eq, x; bypass = false , kwargs... )
135
161
solved = 0
@@ -138,10 +164,10 @@ function integrate_sum(eq, x; bypass = false, kwargs...)
138
164
ts = bypass ? [eq] : terms (eq)
139
165
140
166
for p in ts
141
- s, u, ε = integrate_term (p, x; kwargs... )
142
- solved += s
143
- unsolved += u
144
- ε₀ = max (ε₀, ε )
167
+ sol = integrate_term (p, x; kwargs... )
168
+ solved += get_solved (p, sol)
169
+ unsolved += get_unsolved (p, sol)
170
+ ε₀ = max (ε₀, get_err (p, sol) )
145
171
end
146
172
147
173
if ! isequal (unsolved, 0 ) && isempty (sym_consts (unsolved, x))
@@ -154,10 +180,10 @@ function integrate_sum(eq, x; bypass = false, kwargs...)
154
180
ts = bypass ? [eq] : terms (eq)
155
181
156
182
for p in ts
157
- s, u, ε = integrate_term (p, x; kwargs... )
158
- solved += s
159
- unsolved += u
160
- ε₀ = max (ε₀, ε )
183
+ sol = integrate_term (p, x; kwargs... )
184
+ solved += get_solved (p, sol)
185
+ unsolved += get_unsolved (p, sol)
186
+ ε₀ = max (ε₀, get_err (p, sol) )
161
187
162
188
if ! isequal (u, 0 ) # premature termination on the first failure
163
189
return 0 , eq, ε₀
0 commit comments