LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
integration_table_composite.cpp
浏览该文件的文档.
2
4
5void load_logarithmic_rules(std::vector<detail::IntegrationEntry>& table) {
6 {
7 auto u = wildcard("_u");
8 auto pat = *SymbolicExpr::ln(detail::make_expression_ptr(u));
9 auto x_ln_x = SymbolicExpr::multiply(detail::make_expression_ptr(u), SymbolicExpr::ln(detail::make_expression_ptr(u)));
10 auto res = *sym_sub(*x_ln_x, u);
11 table.push_back(detail::IntegrationEntry("ln(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
12 }
13 {
14 auto u = wildcard("_u");
15 auto inv_u = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(-1));
16 auto pat = *SymbolicExpr::multiply(SymbolicExpr::ln(detail::make_expression_ptr(u)), inv_u);
17 auto ln_sq = SymbolicExpr::power(SymbolicExpr::ln(detail::make_expression_ptr(u)), SymbolicExpr::number(2));
18 auto res = *SymbolicExpr::multiply(ln_sq, sym_rational(1, 2));
19 table.push_back(detail::IntegrationEntry("ln(x)/x", pat, res, {"_u"}, u_is_var("_u"), 50));
20 }
21}
22
23void load_exponential_base_rules(std::vector<detail::IntegrationEntry>& table) {
24 {
25 auto a = wildcard("_a");
26 auto u = wildcard("_u");
27 auto pat = *SymbolicExpr::power(detail::make_expression_ptr(a), detail::make_expression_ptr(u));
28 auto inv_ln_a = SymbolicExpr::power(SymbolicExpr::ln(detail::make_expression_ptr(a)), SymbolicExpr::number(-1));
29 auto a_pow_u = SymbolicExpr::power(detail::make_expression_ptr(a), detail::make_expression_ptr(u));
30 auto res = *SymbolicExpr::multiply(a_pow_u, inv_ln_a);
31 table.push_back(detail::IntegrationEntry("a^x", pat, res, {"_a", "_u"},
32 [](const MatchMap& m, const std::string& var, ComputationContext& context) {
33 if (!u_is_var_a_indep("_u", "_a")(m, var, context)) { return false; }
34 std::optional<detail::AssumptionFacts> assumptions;
35 if (context.assumptions()) { assumptions.emplace(*context.assumptions()); }
36 const FactsQuery& facts = assumptions ?
37 static_cast<const FactsQuery&>(*assumptions) : detail::no_facts();
38 auto logarithm = SymbolicExpr::ln(detail::make_expression_ptr(m.at("_a")));
40 detail::node(logarithm), facts, Domain::Real, context)) &&
42 detail::node(logarithm), facts, Domain::Real, context));
43 }, 70));
44 }
45}
46
47void load_scaled_radical_rules(std::vector<detail::IntegrationEntry>& table) {
48 {
49 auto u = wildcard("_u");
50 auto a = wildcard("_a");
51 auto a_sq = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(2));
52 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
53 auto neg_u_sq = SymbolicExpr::multiply(SymbolicExpr::number(-1), u_sq);
54 auto a_sq_minus_u_sq = SymbolicExpr::add(a_sq, neg_u_sq);
55 auto pat = *SymbolicExpr::power(SymbolicExpr::sqrt(a_sq_minus_u_sq), SymbolicExpr::number(-1));
56
57 auto u_over_a = SymbolicExpr::multiply(detail::make_expression_ptr(u),
58 SymbolicExpr::power(make_unary_function(FT::Abs, detail::make_expression_ptr(a)),
59 SymbolicExpr::number(-1)));
60 auto res = *make_unary_function(FT::ArcSin, u_over_a);
61 table.push_back(detail::IntegrationEntry("1/sqrt(a^2-x^2)", pat, res, {"_u", "_a"},
62 u_is_var_a_nonzero("_u", "_a", true), 50));
63 }
64}
65
66void load_scaled_trig_rules(std::vector<detail::IntegrationEntry>& table) {
67 {
68 auto a = wildcard("_a");
69 auto u = wildcard("_u");
70 auto pat = *SymbolicExpr::sin(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
71 auto inv_a = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(-1));
72 auto neg_inv_a = SymbolicExpr::multiply(SymbolicExpr::number(-1), inv_a);
73 auto cos_ax = SymbolicExpr::cos(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
74 auto res = *SymbolicExpr::multiply(neg_inv_a, cos_ax);
75 table.push_back(detail::IntegrationEntry("sin(a*x)", pat, res, {"_a", "_u"},
76 u_is_var_a_nonzero("_u", "_a"), 55));
77 }
78 {
79 auto a = wildcard("_a");
80 auto u = wildcard("_u");
81 auto pat = *SymbolicExpr::cos(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
82 auto inv_a = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(-1));
83 auto sin_ax = SymbolicExpr::sin(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
84 auto res = *SymbolicExpr::multiply(inv_a, sin_ax);
85 table.push_back(detail::IntegrationEntry("cos(a*x)", pat, res, {"_a", "_u"},
86 u_is_var_a_nonzero("_u", "_a"), 55));
87 }
88 {
89 auto u = wildcard("_u");
90 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
91 auto pat = *SymbolicExpr::multiply(detail::make_expression_ptr(u), SymbolicExpr::cos(u_sq));
92
93 auto u_sq_r = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
94 auto res = *SymbolicExpr::multiply(sym_rational(1, 2), SymbolicExpr::sin(u_sq_r));
95 table.push_back(detail::IntegrationEntry("x*cos(x^2)", pat, res, {"_u"}, u_is_var("_u"), 35));
96 }
97}
98
99void load_exponential_trig_rules(std::vector<detail::IntegrationEntry>& table) {
100 {
101 auto u = wildcard("_u");
102 auto pat = *SymbolicExpr::multiply(
103 SymbolicExpr::exp(detail::make_expression_ptr(u)),
104 SymbolicExpr::sin(detail::make_expression_ptr(u)));
105
106 auto sin_u = SymbolicExpr::sin(detail::make_expression_ptr(u));
107 auto neg_cos_u = SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::cos(detail::make_expression_ptr(u)));
108 auto sin_minus_cos = SymbolicExpr::add(sin_u, neg_cos_u);
109 auto exp_u = SymbolicExpr::exp(detail::make_expression_ptr(u));
110 auto res = *SymbolicExpr::multiply(
111 sym_rational(1, 2),
112 SymbolicExpr::multiply(exp_u, sin_minus_cos));
113 table.push_back(detail::IntegrationEntry("exp(x)*sin(x)", pat, res, {"_u"}, u_is_var("_u"), 35));
114 }
115}
116
117}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
const FactsQuery & no_facts() noexcept
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
void load_scaled_radical_rules(std::vector< detail::IntegrationEntry > &table)
auto u_is_var_a_nonzero(const std::string &u_wc, const std::string &a_wc, bool real_scale=false)
auto u_is_var_a_indep(const std::string &u_wc, const std::string &a_wc)
void load_exponential_trig_rules(std::vector< detail::IntegrationEntry > &table)
void load_logarithmic_rules(std::vector< detail::IntegrationEntry > &table)
void load_exponential_base_rules(std::vector< detail::IntegrationEntry > &table)
void load_scaled_trig_rules(std::vector< detail::IntegrationEntry > &table)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
SymbolicExpr wildcard(const std::string &name)
@ Real
Real numbers
std::shared_ptr< SymbolicExpr > sym_rational(const BigInt &numerator, const BigInt &denominator)
__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
std::unordered_map< std::string, SymbolicExpr > MatchMap
匹配结果映射,通配符名称 → 绑定的表达式
bool normalization_proved(const Result< Tribool > &result)
std::shared_ptr< SymbolicExpr > make_unary_function(FunctionNode::FuncType type, const std::shared_ptr< SymbolicExpr > &operand)
std::shared_ptr< SymbolicExpr > sym_sub(const SymbolicExpr &lhs, const SymbolicExpr &rhs)
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u