LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
integrator.hpp
浏览该文件的文档.
1#pragma once
2
3#include "symbolic.hpp"
5#include <cstddef>
6#include <memory>
7#include <optional>
8#include <set>
9#include <string>
10#include <vector>
11
12namespace LMCAS {
13namespace detail {
14struct IntegrationEntry;
15struct IntegralParts;
16}
17
18class LMCAS_API Integrator {
19public:
20 Integrator();
21 ~Integrator();
22 Integrator(Integrator&&) noexcept;
23 Integrator& operator=(Integrator&&) noexcept;
24 Integrator(const Integrator&) = delete;
25 Integrator& operator=(const Integrator&) = delete;
26
27 Result<SymbolicExpr> integrate_checked(
28 const SymbolicExpr& expr, const std::string& var_name,
29 ComputationContext& context);
30
31 Result<SymbolicExpr> integrate_def_checked(
32 const SymbolicExpr& expr, const std::string& var_name,
33 const SymbolicExpr& lower, const SymbolicExpr& upper,
34 ComputationContext& context);
35
36private:
37 Result<detail::IntegralParts> integrate_recursive(
38 const SymbolicExpr&, const std::string&, ComputationContext&, int,
39 const SymbolicExpr* original = nullptr);
40 Result<std::optional<detail::IntegralParts>> apply_linearity(
41 const SymbolicExpr&, const std::string&, ComputationContext&, int);
42 Result<std::optional<detail::IntegralParts>> dispatch_builtins(
43 const SymbolicExpr&, const std::string&, ComputationContext&, int);
44 Result<std::optional<detail::IntegralParts>> try_power_rule(
45 const SymbolicExpr&, const std::string&, ComputationContext&, int);
46 Result<std::optional<detail::IntegralParts>> try_table_lookup(
47 const SymbolicExpr&, const std::string&, ComputationContext&, int);
48 Result<std::optional<detail::IntegralParts>> try_linear_substitution(
49 const SymbolicExpr&, const std::string&, ComputationContext&, int);
50 Result<std::optional<detail::IntegralParts>> try_substitution(
51 const SymbolicExpr&, const std::string&, ComputationContext&, int);
52 Result<std::optional<detail::IntegralParts>> try_trig_substitution(
53 const SymbolicExpr&, const std::string&, ComputationContext&, int);
54 Result<std::optional<detail::IntegralParts>> try_trig_combination(
55 const SymbolicExpr&, const std::string&, ComputationContext&, int);
56 Result<std::optional<detail::IntegralParts>> try_weierstrass(
57 const SymbolicExpr&, const std::string&, ComputationContext&, int);
58 Result<std::optional<detail::IntegralParts>> try_rational_decomposition(
59 const SymbolicExpr&, const std::string&, ComputationContext&, int);
60 Result<std::optional<detail::IntegralParts>> try_special_function(
61 const SymbolicExpr&, const std::string&, ComputationContext&, int);
62 Result<std::optional<detail::IntegralParts>> try_integration_by_parts(
63 const SymbolicExpr&, const std::string&, ComputationContext&, int);
64
65 std::vector<detail::IntegrationEntry> entries_;
66 SymbolicExpr zero_;
67 struct CycleState {
68 struct Entry {
69 SymbolicExpr integrand;
70 SymbolicExpr original;
71 std::string placeholder;
72 };
73 std::vector<Entry> history;
74 std::set<std::string> occupied_names;
75 std::size_t next_placeholder = 0;
76 };
77 CycleState cycle_state_;
78 std::size_t query_depth_ = 0;
79
80 std::shared_ptr<SymbolicExpr> check_cycle(
81 const SymbolicExpr&, const std::string&, ComputationContext&);
82 bool resolve_cycle(detail::IntegralParts&, const std::string&,
83 const std::string&, ComputationContext&);
84 bool has_cycle_placeholder(const SymbolicExpr&) const;
85};
86
87} // namespace LMCAS
#define LMCAS_API
多元 Hensel 提升(单变量步)
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.