22 const std::shared_ptr<SymbolicExpr>& derivative,
27 std::optional<CasError>* failure,
bool* complete) {
35 if (samples[i] == 0.0) {
36 const auto x =
interval.lo + i * step;
38 result_.push_back({x, x,
true});
42 const auto fa = samples[i];
43 const auto fb = samples[i + 1];
44 if (std::isnan(fa) && std::isnan(fb)) {
47 if (std::isnan(fa) || std::isnan(fb) || fa * fb < 0.0) {
49 interval.lo + (i + 1) * step, fa, fb});
56 std::optional<CasError>* failure,
bool* complete) {
57 while (!
work_.empty()) {
68 auto current =
work_.back();
74 std::vector<IsolatedInterval>
finish(
int max_roots,
bool* complete) {
79 if (max_roots > 0 &&
result_.size() >
static_cast<std::size_t
>(max_roots)) {
83 result_.resize(
static_cast<std::size_t
>(max_roots));
89 lmmc_real_t
sample(lmmc_real_t x, lmmc_real_t offset)
const {
104 const auto fm =
sample(mid, width * 0.125);
115 const auto fm =
sample(mid, width * 0.125);
127 if (std::isnan(fm)) {
132 result_.push_back({mid, mid,
true});
161 const bool finite = !std::isnan(da) && !std::isnan(db);
162 const bool monotone = finite && da * db > 0.0;
167 if (finite && da * db < 0.0 && width >
minimum_width * 2.0) {
174 const std::shared_ptr<SymbolicExpr>&
expr_;
185 const std::shared_ptr<SymbolicExpr>& expr,
186 const std::shared_ptr<SymbolicExpr>& derivative,
189 std::optional<CasError>* failure,
bool* complete) {
194 if (!isolation.initialize(
interval, failure, complete)) {
197 isolation.run(opts, failure, complete);
198 return isolation.finish(opts.
max_roots, complete);
206 const std::shared_ptr<SymbolicExpr>& expr,
207 const std::shared_ptr<SymbolicExpr>& derivative,
212 context.limits().max_ast_nodes,
"isolate_roots");
213 std::optional<CasError> failure;
215 expr, derivative, var,
interval, opts, budget, &failure,
nullptr);
216 if (failure)
throw *failure;
void run(const SolveOptions &opts, std::optional< CasError > *failure, bool *complete)
void subdivide(const SampledInterval &interval)
const std::shared_ptr< SymbolicExpr > & expr_
std::vector< IsolatedInterval > finish(int max_roots, bool *complete)
lmmc_real_t sample(lmmc_real_t x, lmmc_real_t offset) const
bool resample_endpoints(SampledInterval &interval)
RootIsolation(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, RewriteBudget &budget)
bool initialize(const SearchInterval &interval, std::optional< CasError > *failure, bool *complete)
const std::shared_ptr< SymbolicExpr > & derivative_
std::vector< IsolatedInterval > result_
void accept(const SampledInterval &interval, bool confirmed)
void process(const SampledInterval ¤t)
std::vector< SampledInterval > work_
constexpr lmmc_real_t minimum_width
constexpr int initial_divisions
std::variant< RealIsolation, ComplexIsolation > RootIsolation
bool consume_mixed_step(ComputationContext &context, std::optional< CasError > *failure, bool *complete)
lmmc_real_t mixed_evaluate_with_retry(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, lmmc_real_t x, lmmc_real_t half_width, RewriteBudget &budget, int max_retries=3)
lmmc_real_t mixed_evaluate_at(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, lmmc_real_t x, RewriteBudget &budget)
std::vector< IsolatedInterval > isolate_roots_with_context(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const SearchInterval &interval, const SolveOptions &opts, RewriteBudget &budget, std::optional< CasError > *failure, bool *complete)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
std::vector< IsolatedInterval > isolate_roots(const std::shared_ptr< SymbolicExpr > &expr, const std::shared_ptr< SymbolicExpr > &derivative, const std::string &var, const SearchInterval &interval, const SolveOptions &opts)
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
int max_roots
数值候选数量预算;精确解集和整数解族保持完整。